插入 UIPanGestureRecognizer 以关闭具有转换类型 UIPageViewControllerTransitionStyleScroll 的 UIPageViewController
Posted
技术标签:
【中文标题】插入 UIPanGestureRecognizer 以关闭具有转换类型 UIPageViewControllerTransitionStyleScroll 的 UIPageViewController【英文标题】:Plugging UIPanGestureRecognizer to dismiss UIPageViewController with transition type UIPageViewControllerTransitionStyleScroll 【发布时间】:2013-10-03 18:36:14 【问题描述】:我正在使用UIPageViewController
滚动浏览一些视图控制器。但是,我需要关闭视图控制器数组开头和结尾处的UIPageViewController
,即,如果在滚动页面视图控制器时,如果我们已经到达视图控制器数组的边界,则关闭视图控制器。
对于解雇,我使用了一个名为 dismissPanGestureRecognizer
的 UIPanGestureRecognizer
。当 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
没有任何手势识别器。看起来它是使用名为UIQueuingScrollView
的内部视图(pageViewController.view.subviews)实现的,我宁愿不要乱用它。
发生的情况是,在滚动转换类型中,在视图控制器的边界处,滚动视图只是弹跳,并且平移手势识别器永远不会因解雇而被触发。我曾尝试将 UIQueuingScrollView 的 bounces
属性设置为 NO,然后页面甚至没有改变。
接下来我尝试在UIPageViewController
视图之上添加一个透明的UIView
,然后在其上实现hitTest:withEvent:
,我认为只有当它不在边界时我才会将事件转发到pageViewController。但是,虽然它确实在一定程度上控制了何时允许翻页,但它也会阻止其他手势传递给 pageController 视图(例如点击按钮等)。
当我到达 UIPageViewController 的边界(UIPageViewControllerDataSource 方法返回 nil
),当转换样式为 UIPageViewControllerTransitionStyleScroll
时,我正在尝试寻找如何让我自己的 UIPanGestureRecognizer 被触发的方法。
我目前正在 ios6/iOS7 上进行测试。
【问题讨论】:
【参考方案1】:您可以通过对您在UIPageViewController
对象或实现其datasource
的对象上跟踪的currentPageIndex
属性作出反应来实现所需的效果。检查此属性并在 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");
希望这会有所帮助...
【讨论】:
感谢您的回答。这将让我知道何时关闭视图控制器,我已经能够从PageViewController
的 dataSource 方法中获得它。但是我看不到如何使用它来插入要使用的 UIPanGestureRegocnizer 来代替 PageViewController 的 UIQueuingScrollView 使用的手势以上是关于插入 UIPanGestureRecognizer 以关闭具有转换类型 UIPageViewControllerTransitionStyleScroll 的 UIPageViewController的主要内容,如果未能解决你的问题,请参考以下文章
如何在父视图中限制 UIPanGestureRecognizer
未调用 iOS 13 UIPanGestureRecognizer 选择器