Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UIPageViewController在iOS中自动滚动_Ios_Objective C_Uipageviewcontroller - Fatal编程技术网

UIPageViewController在iOS中自动滚动

UIPageViewController在iOS中自动滚动,ios,objective-c,uipageviewcontroller,Ios,Objective C,Uipageviewcontroller,我正在制作一个应用程序,其中PageViewController应该在某个时间间隔内滚动。目前我已经做了直到手动滚动。用户可以滚动任何图像,它将工作。但仍然坚持使用用户触摸实现自动滚动。下面是我的代码。请帮我做这个 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. _pageTitles = @[@"", @"", @"", @""]

我正在制作一个应用程序,其中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;
}

也许您正在寻找的方法是
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

希望能有帮助。。快乐编码…)