我使用UIPageViewController
滚动浏览某些视图控制器。但是,我需要在视图控制器数组的开头和结尾忽略UIPageViewController
,即,如果在滚动浏览页面视图控制器时,如果我们已到达视图控制器数组的边界,则关闭视图控制器
对于解雇,我使用名为UIPanGestureRecognizer
的{{1}}。当UIPageViewController的过渡样式为dismissPanGestureRecognizer
时,这非常有效。在这种情况下,我可以这样连接我的手势 -
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的UIQueuingScrollView
属性设置为NO,然后页面甚至没有更改。
接下来,我尝试在bounces
视图的顶部添加一个透明的UIView
,然后在其上实现UIPageViewController
,以为只有当它不在时才会将事件转发到pageViewController边界。但是虽然它确实可以控制何时允许页面转动,但它也会阻止其他手势传递给pageController视图(例如点击按钮等)。
当我到达UIPageViewController的边界时(UIPageViewControllerDataSource方法返回hitTest:withEvent:
),当转换样式为nil
时,我试图找到如何让我自己的UIPanGestureRecognizer被触发的方法。
我目前正在iOS6 / iOS7上进行测试。
答案 0 :(得分: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");
}
希望这会有所帮助......