以编程方式控制UIPageViewController运动

时间:2014-11-13 15:28:46

标签: ios uipageviewcontroller

我有两个按钮可用于在UIPageViewController中启动页面转换。我以编程方式开始从一个页面转换到另一个页面:

//to go left
[_pageVC setViewControllers:@[[self pageViewController:_pageVC viewControllerBeforeViewController:[_pageVC.viewControllers lastObject]]]
                      direction:UIPageViewControllerNavigationDirectionReverse
                       animated:YES
                     completion:^(BOOL finished) { }];

问题在于按钮的位置使得很容易快速点击它们几次,这会导致不必要的行为甚至崩溃应用程序。所以我想在页面转换时停用它们。

出于这个目的,我创建了一个BOOL,我在动画开始时将其设置为YES,但我不知道将它再次设置为NO的位置。上面函数中的completition块过早调用,如果以编程方式启动转换,则不会调用pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:(来自文档:Called after a gesture-driven transition completes)。

如何在执行转换时停用按钮?

2 个答案:

答案 0 :(得分:0)

我使用了pbasdf中的解决方案来禁用按钮,但它可能已经正常工作了。我意识到问题不在于按钮的禁用,而是刷卡仍处于活动状态,导致奇怪的行为。

当使用this method启用/禁用按钮时,我禁用并启用滑动:

-(void)setPVScrollEnabled:(BOOL)scrollEnabled
{
    for (UIScrollView *view in self.pageViewController.view.subviews) {

        if ([view isKindOfClass:[UIScrollView class]]) {

            view.scrollEnabled = scrollEnabled;
        }
    }
}

答案 1 :(得分:0)

添加超时。例如,禁用按钮0.5秒:

self.buttonNext.enabled = NO;  
self.buttonPrev.enabled = NO;

[_pageVC setViewControllers:@[[self pageViewController:_pageVC viewControllerBeforeViewController:[_pageVC.viewControllers lastObject]]]
                      direction:UIPageViewControllerNavigationDirectionReverse
                       animated:YES
                     completion:nil];

  __weak YourClass *weakSelf = self;
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{  
  weakSelf.buttonNext.enabled = YES;  
  weakSelf.buttonPrev.enabled = YES;  
});