**防止在水平Scrollview中拖动两个CollectionViews **

时间:2016-03-16 19:34:37

标签: ios objective-c uiscrollview uicollectionview uigesturerecognizer

我在水平滚动视图中有两个集合视图。为简化起见,我没有导航栏或工具栏/ TabBar。因此,我可以在集合视图(垂直滚动)中完美滚动,也可以在集合视图之间完美滚动(使用水平滚动视图)。但是,我能够以某种方式拖动集合视图。为了区分,我设置了不同的背景颜色。所以,我有一个水平滚动视图,背景颜色为黄色和两个子视图:第一个集合视图的背景颜色为红色,第二个集合视图的背景颜色为蓝色。水平滚动视图的工作方式与UIPageControl类似。

我遇到的问题之一就是当我在两个滚动视图中滚动到顶部时,在集合视图滚动指示符消失后(集合视图停止滚动),我无法再滚动到顶部(在集合视图中得到弹性效果,而是在超视图(水平滚动视图)上接收触摸,然后,集合视图被移位/错位20个像素,我通过子类化水平滚动视图和更改来解决这个问题手势识别器方法:

override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
    print("RECEIVING GEST RECOGNIZER IN CUSTOM SCROLLVIEW")
    if gestureRecognizer.isKindOfClass(UIPanGestureRecognizer){
        print("GEST IS PANGESTURERECOGNIZER")
         let gesture = gestureRecognizer as! UIPanGestureRecognizer
         if gesture.translationInView(self).y != 0  {
                print("DO NOT ALLOW VERTICAL SCROLLING")
                return false
         }
    }
    return true
}

这似乎是一个hacky解决方案,并不完美,因为当我开始手势只是水平移动时,手势被识别,因为translation.y == 0然后我也可以在y轴上移动。像func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {这样连续检查而不是仅在开头检查的其他方法不能以某种方式识别水平滚动。因此,我现在能想到的唯一解决方案是覆盖水平滚动视图的UIPanGestureRecognizer,只允许水平转换,但看起来很笨拙。请帮忙。 Objective-C解决方案与Swift一样受欢迎。

1 个答案:

答案 0 :(得分:0)

所以,这个问题与UIStatusBar有些相关。我不明白为什么,但是当状态栏出现时,可能会拖延"每次我向下滑动集合视图的滚动视图时,集合视图下降20个像素,向上滚动到顶部。我通过拨打UIApplication.sharedApplication().statusBarHidden = false取消了状态栏,问题解决了!