将 UIPageViewController(带有 TransitionStyleScroll)平移手势限制到某个区域

Posted

技术标签:

【中文标题】将 UIPageViewController(带有 TransitionStyleScroll)平移手势限制到某个区域【英文标题】:Restrict UIPageViewController (with TransitionStyleScroll) pan gesture to a certain area 【发布时间】:2014-01-30 16:20:35 【问题描述】:

在我的应用程序中,我有一个 RootPageViewController,其中包含 UIPageViewController 和一个或多个 DetailPageViewController,其中 UITableView 作为子视图。

                          DetailPageViewController
                        / 
RootPageViewController  - DetailPageViewController
                        \
                          DetailPageViewController

每个 DetailPageViewController 的顶部都有一个小空间,应该可以在其中滑动并到达下一个 DetailPageViewController。

 ------------------- 
|                   |
|                   |  -> UIPageViewController should respond to pan's
|                   |
|-------------------|   --------------------------------------------
|  CellContent      |  
|-------------------|
|  CellContent      |
|-------------------|  -> UIPageViewController should disable UIPageViewController pan's
|  CellContent      |
|-------------------|
|  ...              |

ios 7 天气应用程序中,有一个滚动视图,带有整个弱预测,它以某种方式覆盖或禁用 UIPageViewController 的平移。

我怎样才能重现这种行为?

抱歉,缺少截图

【问题讨论】:

【参考方案1】:

我通过子类化 UIPageViewController,找到它的 UIScrollView(迭代 self.subviews),并向该滚动视图添加一个新的 UIPanGestureRecognizer 来做到这一点。

我将我的子类 UIPageViewController 设置为新的 UIPanGestureRegognizer 的代表。然后我实现了两个委托方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

  return NO;

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

我决定是要“吃掉这个事件”(回复是)还是要 UIScrollView 的原始 UIPanGestureViewRecognizer 来处理它(回复否)。所以,YES-reply 意味着 UIPageViewController 不会滚动到下一个 ViewController。

【讨论】:

lukaszielinski.de/blog/posts/2014/03/26/… 这里有很多详细的答案,说的是同样的事情 谢谢你们两个:) 好了,不需要额外添加 panGestureRecognizer!您可以与提供的行为相同,而不必执行所有这些gestureRecognizershouldRecognizeSimultaneouslyWithGestureRecognizer: business... ;-)【参考方案2】:

我在 Swift 中的解决方案:

let myview = UIView(frame: CGRect(x:0, y:0, width:320, height:320))
//dummy view that defines the area where the gesture works
self.view.addSubview(myview)

for x in self.pageViewController!.view.subviews 
 if x is UIScrollView
   myview.addGestureRecognizer(x.panGestureRecognizer)  

【讨论】:

以上是关于将 UIPageViewController(带有 TransitionStyleScroll)平移手势限制到某个区域的主要内容,如果未能解决你的问题,请参考以下文章

带有PageControl的UIPageViewController

带有 Peeking 的 UIPageViewController

带有 PageControl 的 UIPageViewController

无法将自动布局约束添加到 UIPageViewController

带有渐变叠加的 UIPageViewController?

带有 UINavigationBar 的 UIPageViewController 内的 UIWebView