0

我正在使用 aUIPageViewController滚动浏览一些视图控制器。但是,我需要关闭UIPageViewController视图控制器数组的开头和结尾,即,如果在滚动页面视图控制器时,如果我们已经到达视图控制器数组的边界,则关闭视图控制器。

对于解雇,我正在使用UIPanGestureRecognizer被调用的dismissPanGestureRecognizer. 当 UIPageViewController 的过渡样式为UIPageViewControllerTransitionStylePageCurl. 在那种情况下,我可以像这样连接我的手势-

viewDidLoad

[pageViewController.gestureRecognizers enumerateObjectsUsingBlock:^(UIGestureRecognizer *gR, NSUInteger idx, BOOL *stop){
    gR.delegate = self;
    [dismissPanGestureRecognizer requireGestureRecognizerToFail:gR];
}];

self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;

对于UIGestureRecognizerDelegate方法,它是这样的 -

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    // If we are at the left boundary and this is a pan gesture going right-left,
    // return NO
    // Else If we are at the right boundary and this is a pan gesture going left-right,
    // return NO
    // Else return YES
}

到目前为止,一切都很好。如果它是平移手势,我们仅在页面视图控制器手势对它不感兴趣时​​才使用它来关闭。

当过渡样式为UIPageViewControllerTransitionStyleScroll. 在这种情况下,UIPageViewController没有任何手势识别器。看起来它是使用一个内部视图(pageViewController.view.subviews)实现的UIQueuingScrollView,我不想乱用它。发生的情况是,在滚动转换类型中,在视图控制器的边界处,滚动视图只是弹跳,并且平移手势识别器永远不会因解雇而被触发。我曾尝试将bouncesUIQueuingScrollView 的属性设置为 NO,然后页面甚至没有改变。

UIView接下来,我尝试在视图顶部添加一个透明的UIPageViewController,然后hitTest:withEvent:在其上实现,我认为只有当它不在边界时,我才会将事件转发到 pageViewController。但是,虽然它确实对何时允许页面翻转提供了一定程度的控制,但它也会阻止其他手势传递给 pageController 视图(如点击按钮等)。

当我到达 UIPageViewController 的边界(UIPageViewControllerDataSource 方法返回nil)时,当转换样式为UIPageViewControllerTransitionStyleScroll.

我目前正在 iOS6/iOS7 上进行测试。

4

1 回答 1

0

您可以通过currentPageIndex对您在UIPageViewController对象上或在实现其datasource. currentPageIndex == 0 || n-1在其中一个UIPageViewController委托方法(可能是下面两个中的后者)中检查此属性并处理解雇:

#pragma mark - UIPageViewController Delegate

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers
{
    NSLog(@"will transition");
}

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
    NSLog(@"did finish animating");
}

希望这会有所帮助...

于 2013-10-03T18:44:59.927 回答