Как установить страницу по умолчанию на правой стороне вместо левой (в обратном направлении) при запуске приложения, которое использует UIPageControl из UIScrollView? - PullRequest
1 голос
/ 19 августа 2009

Мой случай:

У меня есть оригинальное приложение Page Control от Apple. Я хотел бы изменить запуск приложения с правой стороны на странице управления в нижней части UIScrollView? По умолчанию при запуске - это на первой странице, которая слева. Скажем, например, у меня есть 7 страниц. Итак, я хочу, чтобы первая страница появилась на последней странице, которая находится на 7-й странице, и вторая страница на 6-й странице и так далее. Короче говоря, обратное значение по умолчанию.

Я знаю, что должен быть один код, который делает этот трюк. Я не уверен, что это такое. Пожалуйста помоги. Спасибо!

Ниже приведено описание приложения Page Control от Apple:

PageControl

Это приложение демонстрирует использование функции подкачки UIScrollView для использования горизонтальной прокрутки в качестве механизма для навигации между различными страницами контента. Каждая страница управляется собственным контроллером представления, который загружается только тогда, когда это необходимо. UIPageControl отображается в нижней части окна в качестве альтернативного интерфейса для перемещения между страницами

Код в AppDelegate.m

#import "AppDelegate.h"
#import "MyViewController.h"

static NSUInteger kNumberOfPages = 7;

@interface AppDelegate (PrivateMethods)

- (void)loadScrollViewWithPage:(int)page;
- (void)scrollViewDidScroll:(UIScrollView *)sender;

@end

@implementation AppDelegate

@synthesize window, scrollView, pageControl, viewControllers;

- (void)dealloc {
    [viewControllers release];
    [scrollView release];
    [pageControl release];
    [window release];
    [super dealloc];
}

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    // view controllers are created lazily
    // in the meantime, load the array with placeholders which will be replaced on demand
    NSMutableArray *controllers = [[NSMutableArray alloc] init];
    for (unsigned i = 0; i < kNumberOfPages; i++) {
        [controllers addObject:[NSNull null]];
    }
    self.viewControllers = controllers;
    [controllers release];

    // a page is the width of the scroll view
    scrollView.pagingEnabled = YES;
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height);
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.showsVerticalScrollIndicator = NO;
    scrollView.scrollsToTop = NO;
    scrollView.delegate = self;

    pageControl.numberOfPages = kNumberOfPages;
    pageControl.currentPage = 0;

    // pages are created on demand
    // load the visible page
    // load the page on either side to avoid flashes when the user starts scrolling
    [self loadScrollViewWithPage:0];
    [self loadScrollViewWithPage:1];
}

- (void)loadScrollViewWithPage:(int)page {
    if (page < 0) return;
    if (page >= kNumberOfPages) return;

    // replace the placeholder if necessary
    MyViewController *controller = [viewControllers objectAtIndex:page];
    if ((NSNull *)controller == [NSNull null]) {
        controller = [[MyViewController alloc] initWithPageNumber:page];
        [viewControllers replaceObjectAtIndex:page withObject:controller];
        [controller release];
    }

    // add the controller's view to the scroll view
    if (nil == controller.view.superview) {
        CGRect frame = scrollView.frame;
        frame.origin.x = frame.size.width * page;
        frame.origin.y = 0;
        controller.view.frame = frame;
        [scrollView addSubview:controller.view];
    }
}

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    // We don't want a "feedback loop" between the UIPageControl and the scroll delegate in
    // which a scroll event generated from the user hitting the page control triggers updates from
    // the delegate method. We use a boolean to disable the delegate logic when the page control is used.
    if (pageControlUsed) {
        // do nothing - the scroll was initiated from the page control, not the user dragging
        return;
    }
    // Switch the indicator when more than 50% of the previous/next page is visible
    CGFloat pageWidth = scrollView.frame.size.width;
    int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    pageControl.currentPage = page;

    // load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling)
    [self loadScrollViewWithPage:page - 1];
    [self loadScrollViewWithPage:page];
    [self loadScrollViewWithPage:page + 1];

    // A possible optimization would be to unload the views+controllers which are no longer visible
}

// At the end of scroll animation, reset the boolean used when scrolls originate from the UIPageControl
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    pageControlUsed = NO;
}

- (IBAction)changePage:(id)sender {
    int page = pageControl.currentPage;
    // load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling)
    [self loadScrollViewWithPage:page - 1];
    [self loadScrollViewWithPage:page];
    [self loadScrollViewWithPage:page + 1];
    // update the scroll view to the appropriate page
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    [scrollView scrollRectToVisible:frame animated:YES];
    // Set the boolean used when scrolls originate from the UIPageControl. See scrollViewDidScroll: above.
    pageControlUsed = YES;
}

@end

Ответы [ 2 ]

2 голосов
/ 19 августа 2009

Взяв пример PageControl от Apple, вот код, который сделает это. Я проверил его, и он отлично работает, за исключением того, что заметил переход элемента управления страницы при запуске приложения с начальной точки до последней, но я не знаю, как это решить. Дайте мне знать, если это не сработает для вас.

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    // view controllers are created lazily
    // in the meantime, load the array with placeholders which will be replaced on demand
    NSMutableArray *controllers = [[NSMutableArray alloc] init];
    for (unsigned i = 0; i < kNumberOfPages; i++) {
        [controllers addObject:[NSNull null]];
    }
    self.viewControllers = controllers;
    [controllers release];

    // a page is the width of the scroll view
    scrollView.pagingEnabled = YES;
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height);
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.showsVerticalScrollIndicator = NO;
    scrollView.scrollsToTop = NO;
    scrollView.delegate = self;

    // First, set the number of pages
    pageControl.numberOfPages = kNumberOfPages;
    // Then, tell the page control that you're on the last page (numPages - 1, since we're 0-indexed)
    pageControl.currentPage = kNumberOfPages - 1;

    // Now, we have to tell the frame that we're at the end of the frame
    // So we set the content offset to be the last page
    scrollView.contentOffset = CGPointMake(scrollView.frame.size.width * (kNumberOfPages - 1), 0);

    // pages are created on demand
    // load the visible page
    // load the page on either side to avoid flashes when the user starts scrolling
    // [self loadScrollViewWithPage:0];
    // [self loadScrollViewWithPage:1];

    // Now, instead of loading the original page, we load the last two pages
    [self loadScrollViewWithPage:kNumberOfPages - 1];
    [self loadScrollViewWithPage:kNumberOfPages - 2];
}
2 голосов
/ 19 августа 2009

Ну, вы можете просто установить смещение scrollViews как последнюю страницу, и тогда оно начнется с последней страницы, и вам придется прокручивать вправо, а не влево ... используйте UIScrollViews - (void) setContentOffset: (CGPoint) contentOffset animated: (BOOL) анимированный метод.

...