UIPageViewController在iOS中自动滚动
我正在制作一个应用程序,其中PageViewController应该在某个时间间隔内滚动。目前我已经做了直到手动滚动。用户可以滚动任何图像,它将工作。但仍然坚持使用用户触摸实现自动滚动。下面是我的代码。请帮我做这个UIPageViewController在iOS中自动滚动,ios,objective-c,uipageviewcontroller,Ios,Objective C,Uipageviewcontroller,我正在制作一个应用程序,其中PageViewController应该在某个时间间隔内滚动。目前我已经做了直到手动滚动。用户可以滚动任何图像,它将工作。但仍然坚持使用用户触摸实现自动滚动。下面是我的代码。请帮我做这个 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. _pageTitles = @[@"", @"", @"", @""]
- (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;
}
也许您正在寻找的方法是
setViewControllers:direction:animated:completion:
当然,您需要提供希望在动画结束时可见的视图控制器
您可以在动画设置为“是”时调用此选项,控制器将自动翻页:)
有关更多信息,请参阅@Daniel您的链接已断开,您的“答案”对解释您的问题解决方案几乎没有帮助。对于那些有兴趣阅读的文档 这里要注意的方法是:
- (void)setViewControllers:(NSArray *)viewControllers
direction:(UIPageViewControllerNavigationDirection)direction
animated:(BOOL)animated
completion:(void (^)(BOOL finished))completion
UIPageViewController希望您根据一个值告诉它要传递什么数据以及要使用什么控制器。这里我告诉我的UIPageController子类是委托和dataSouce。配置委托方法和viewControllerAtIndex数据源方法后,我添加了一个自定义间隔,用于调用loadNextController方法。在该方法中,我检查“next”控制器是否为nil。如果不是nil,我将“next”控制器作为@[起始控制器]传递回对SetViewController的第二次调用。如果为nil,我只需将索引值重置为零,并使用我的“下一个”控制器作为@[启动控制器]调用SetViewController。此自定义子类用于自动分页到下一个或第一个控制器。好处是用户交互仍然由UIPageViewController类处理
注意:需要对SetViewController进行初始调用,因为UIPageViewContrller不知道是否可以首先加载任何viewController。我对SetViewController的第二次调用只不过是跳到下一个或第一个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];
}
-(void)viewDidLoad{
[超级视图下载];
self.index=0;
self.delegate=self;
self.dataSource=self;
/*!设置间隔*/
[NSTimer scheduledTimerWithTimeInterval:10.0
目标:自我
选择器:@selector(loadNextController)
用户信息:无
重复:是];
/*!设置启动控制器*/
NSArray*StartingViewController=@[[self-viewControllerAtIndex:self.index]];
[自设置视图控制器:启动视图控制器
方向:UIPageViewControllerNavigationDirectionForward
动画:是的
完成:无];
}
-(UIViewController*)页面视图控制器:(UIPageViewController*)页面视图控制器视图控制器预览控制器:(UIViewController*)视图控制器{
NSUInteger index=((YSPageContentViewController*)viewController.pageIndex;
如果(索引>0){
返回[self-viewControllerAtIndex:index-1];
}
返回零;
}
-(UIViewController*)pageViewController:(UIPageViewController*)pageViewController viewControllerAfterViewController:(UIViewController*)viewController{
NSUInteger index=((YSPageContentViewController*)viewController.pageIndex;
如果(索引+1<[self.items count]){
返回[self-viewControllerAtIndex:index+1];
}
返回零;
}
-(PageContentViewController*)viewControllerAtIndex:(nsInteger)索引{
如果(索引<[self.items count]){
PageContentViewController*PageContentViewController=[[PageContentViewController alloc]init];
pageContentViewController.pageIndex=索引;
pageContentViewController.image=(UIImage*)self.items[索引];
返回页面内容视图控制器;
}
返回零;
}
/*! 设置下一个控制器*/
-(无效)loadNextController{
PageContentViewController*nextViewController=[self-viewControllerAtIndex:self.index++];
if(nextViewController==nil){
self.index=0;
nextViewController=[self-viewControllerAtIndex:self.index];
}
[self-SetViewController:@[nextViewController]
方向:UIPageViewControllerNavigationDirectionForward
动画:是的
完成:无];
}
注意:这确实有效;但是,当内部手势识别器更改控制器时,我并不总是返回正确的控制器。在这条路上的某个地方,我正在失去对索引的跟踪。我将用我完成的实现更新它 研究了@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
希望能有帮助。。快乐编码…)