UIPageViewController在iOS中自动滚动

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

- (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; } 

@Daniel你的链接被破坏了,你的“答案”几乎没有解释你的问题的解决scheme。 对于那些有兴趣阅读UIPageViewController类的文档。

这里要注意的方法是:

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

UIPageViewController期望您根据一个值告诉它要传送什么数据和使用哪个控制器。 在这里我告诉我的UIPageController子类是委托和dataSouce。 configuration委托方法和viewControllerAtIndex数据源方法后,我添加了一个自定义的时间间隔,调用我的loadNextController方法。 在这个方法中,我正在检查“下一个”控制器是否为零。 如果它不是零,我将“下一步”控制器作为@ [启动控制器]传递给第二次调用setViewControllers。 如果它是零,我只是重置索引值为零,并调用setViewControllers与我的“下一步”控制器作为@ [起始控制器]。 这个自定义的子类用来自动寻呼下一个或第一个控制器。 奖励是用户交互仍然由UIPageViewController类来处理。

注意:对于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]; } 

注意:这是行得通的。 但是,当内部手势识别器更改控制器时,我并不总是返回正确的控制器。 一路上我失去了索引的轨迹。 我将使用我的完成实现进行更新。

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

当然,你需要提供你想在animation结束时可见的视图控制器。

你可以调用这个animation设置为YES,控制器将自动翻页:)

请参阅文档了解更多

工作在@ 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的animation

 - (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。

希望它有助于..快乐编码.. 🙂