2014-10-31 25 views
1

我正在制作一个应用程序,其中PageViewController应该在某个时间间隔内滚动。目前我已完成手动滚动。用户可以滚动任何图像,它会工作。但坚持实现用户触摸自动滚动。以下是我的代码。请帮助我。UIPageViewController在iOS中自动滚动

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    _pageTitles = @[@"", @"", @"", @""]; 
    _pageImages = @[@"page1.png", @"page2.png", @"page3.png", @"page4.png"]; 

    // Create page view controller 
    self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; 
    self.pageViewController.dataSource = self; 

    PageContentViewController *startingViewController = [self viewControllerAtIndex:0]; 
    NSArray *viewControllers = @[startingViewController]; 
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 

    // Change the size of page view controller 
    self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 50); 

    [self addChildViewController:_pageViewController]; 
    [self.view addSubview:_pageViewController.view]; 
    [self.pageViewController didMoveToParentViewController:self]; 
} 

- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index 
{ 
    if (([self.pageTitles count] == 0) || (index >= [self.pageTitles count])) { 
     return nil; 
    } 

    // Create a new view controller and pass suitable data. 
    PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"]; 
    pageContentViewController.imageFile = self.pageImages[index]; 
    pageContentViewController.titleText = self.pageTitles[index]; 
    pageContentViewController.pageIndex = index; 

    return pageContentViewController; 
} 

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:YES]; 

    self.navigationController.navigationBar.hidden = YES; 
} 

#pragma mark - Page View Controller Data Source 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = ((PageContentViewController*) viewController).pageIndex; 

    if ((index == 0) || (index == NSNotFound)) { 
     return nil; 
    } 

    index--; 
    return [self viewControllerAtIndex:index]; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = ((PageContentViewController*) viewController).pageIndex; 

    if (index == NSNotFound) { 
     return nil; 
    } 

    index++; 
    if (index == [self.pageTitles count]) { 
     return nil; 
    } 
    return [self viewControllerAtIndex:index]; 
} 

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController 
{ 
    return [self.pageTitles count]; 
} 

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController 
{ 
    return 0; 
} 

回答

3

@Daniel你的链接查看documentation坏了,你的“答案”做一点解释你解决问题的方法。对于那些有兴趣阅读UIPageViewController Class的文档。

要注意这里的方法是:

- (void)setViewControllers:(NSArray *)viewControllers 
       direction:(UIPageViewControllerNavigationDirection)direction 
        animated:(BOOL)animated 
       completion:(void (^)(BOOL finished))completion 

的UIPageViewController希望你告诉它提供什么样的数据,并使用基于值什么控制器。这里我告诉我的UIPageController子类是委托和数据访问。配置委托方法和viewControllerAtIndex数据源方法后,我添加了一个自定义时间间隔,它调用了我的loadNextController方法。在该方法中,我正在检查“下一个”控制器是否为零。如果它不是零,我将“下一个”控制器作为@ [启动控制器]传递给第二次调用setViewControllers。如果它是零,我只是将索引值重置为零,并使用我的“下一个”控制器作为@ [起始控制器]调用setViewControllers。这个自定义子类用于自动寻呼到下一个或第一个控制器。奖励是用户交互仍然由UIPageViewController Class处理。

注意:初始调用setViewControllers是必需的,因为您的UIPageViewContrller不知道如果可以首先加载任何viewController。我第二次调用setViewControllers只不过是跳到下一个或第一个viewController。

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.index = 0; 
    self.delegate = self; 
    self.dataSource = self; 

    /*! setup an interval */ 
    [NSTimer scheduledTimerWithTimeInterval:10.0 
            target:self 
            selector:@selector(loadNextController) 
            userInfo:nil 
            repeats:YES]; 

    /*! set starting controller */ 
    NSArray *startingViewControllers = @[[self viewControllerAtIndex:self.index]]; 

    [self setViewControllers: startingViewControllers 
        direction: UIPageViewControllerNavigationDirectionForward 
        animated: YES 
        completion: nil]; 
} 

- (UIViewController*)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { 
    NSUInteger index = ((YSPageContentViewController*) viewController).pageIndex; 
    if (index > 0) { 
     return [self viewControllerAtIndex:index-1]; 
    } 
    return nil; 
} 

- (UIViewController*)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { 
    NSUInteger index = ((YSPageContentViewController*) viewController).pageIndex; 
    if (index+1 < [self.items count]) { 
     return [self viewControllerAtIndex:index+1]; 
    } 
    return nil; 
} 

- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index{ 
    if (index < [self.items count]) { 
     PageContentViewController *pageContentViewController = [[PageContentViewController alloc]init]; 
     pageContentViewController.pageIndex = index; 
     pageContentViewController.image = (UIImage*)self.items[index]; 
     return pageContentViewController; 
    } 
    return nil; 
} 

/*! set next controller */ 
- (void)loadNextController { 
    PageContentViewController *nextViewController = [self viewControllerAtIndex:self.index++]; 
    if (nextViewController == nil) { 
     self.index = 0; 
     nextViewController = [self viewControllerAtIndex:self.index]; 
    } 
    [self setViewControllers:@[nextViewController] 
        direction:UIPageViewControllerNavigationDirectionForward 
        animated:YES 
        completion:nil]; 
} 

注意:这是行不通的;但是,当内部手势识别器更改控制器时,我并不总是返回正确的控制器。一路上我正在失去对指数的追踪。我会用我的完成实施更新这个。

+0

请更新回答Swift 3 – Mamta 2017-06-19 16:03:11

0

也许你正在寻找的方法是setViewControllers:direction:animated:completion:

当然,你需要提供你想在动画的最后看到的视图控制器。

您可以通过动画集调用此为YES,控制器将自动页面:)

更多

0

工作@ Ryan的回答。修正@Ryan问题“,但是当内部手势识别器改变控制器时,我并不总是返回正确的控制器。在这个过程中,我正在失去对索引的跟踪。

只编辑了几行,它为我工作。如果有人需要相同的话,可以考虑分享。

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
_pageTitles = @[@"Tips n Tricks", @"Join to learn", @"Share to get points"]; 
self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; 
self.pageViewController.dataSource = self; 
self.pageViewController.delegate = self; 

[NSTimer scheduledTimerWithTimeInterval:10.0 
           target:self 
           selector:@selector(loadNextController) 
           userInfo:nil 
           repeats:YES]; 
PageContentViewController *startingViewController = [self viewControllerAtIndex:0]; 
NSArray *viewControllers = @[startingViewController]; 
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 

// Change the size of page view controller 

self.pageViewController.view.frame = _containerView.frame; 
self.pageControl.numberOfPages = _pageTitles.count; 
self.pageControl.currentPage = 0; 
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; 
[self addChildViewController:_pageViewController]; 
[self.view addSubview:_pageViewController.view]; 
[self.pageViewController didMoveToParentViewController:self]; 
[self.view bringSubviewToFront:self.pageControl]; 

} 

实现数据源PageViewController

的方法
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = ((PageContentViewController*) viewController).pageIndex; 
    if ((index == 0) || (index == NSNotFound)) { 
     index = _pageTitles.count; 
    } 
    index--; 
    return [self viewControllerAtIndex:index]; 
} 
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = ((PageContentViewController*) viewController).pageIndex; 
     if (index == NSNotFound) { 
      return nil; 
    } 
    index++; 
    if (index == [self.pageTitles count]) { 
     index = 0; 
    } 
    return [self viewControllerAtIndex:index]; 
} 
- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index 
{ 
    if (([self.pageTitles count] == 0) || (index >= [self.pageTitles count])) { 
     return nil; 
    } 
    PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"]; 
    pageContentViewController.titleText = self.pageTitles[index]; 
    pageContentViewController.pageIndex = index; 
    return pageContentViewController; 
} 
的PageController委托

实施didFinishAnimating方法去获得PageViewController的当前索引和更新的PageControl相应

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed 
{ 
    PageContentViewController *currentViewController = pageViewController.viewControllers[0]; 
    currentIndex = (int)currentViewController.pageIndex; 
    [self.pageControl setCurrentPage:currentIndex]; 
} 

,并在最后执行的方法在动画上更新PageViewController

- (void)loadNextController { 
    currentIndex++; 
    PageContentViewController *nextViewController = [self viewControllerAtIndex:currentIndex]; 
    if (nextViewController == nil) { 
     currentIndex = 0; 
     nextViewController = [self viewControllerAtIndex:currentIndex]; 
    } 
    [self.pageViewController setViewControllers:@[nextViewController] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 
    [self.pageControl setCurrentPage:currentIndex]; 
} 

当前索引被全局声明以跟踪当前PageViewController的索引并相应地更新PageController。

希望它有帮助..快乐编码.. :)

相关问题