UIScrollView中的UIScreenEdgePanGestureRecognizer

时间:2016-01-11 00:26:18

标签: ios uiscrollview mkmapview uigesturerecognizer

我有一个包含3个视图的水平滚动视图。第一个视图(最左侧)是地图视图。我想要的功能是用户只能通过从最右边缘滑动来转到第二个视图,因为我想要其他手势来操纵地图。但是,从第二个和第三个视图,他们可以通过在视图上的任何位置滑动来向左或向右移动。我已经搜索了如何做到这一点,并且在我的具体情况下没有运气。

我不知道从哪里开始如此,如果有人能指出我的方向是正确的。

到目前为止,我已经尝试过:

在第一个视图上禁用滚动并添加代码:

let edgeRecognizer = UIScreenEdgePanGestureRecognizer(target: firstView, action: "goToSecondView:")
    edgeRecognizer.edges = .Right

func goToSecondView(){
    scrollView.contentOffset = CGPoint(x: self.scrollView.contentSize.width/3, y: scrollView.contentOffset.y)
}

2 个答案:

答案 0 :(得分:3)

非常简单,只需将此代理功能放在UIScreenEdgePanGestureRecognizer上并设置UIGestureRecognizerDelegate

使用Xcode 8和Swift 3:)

您需要这3个代理功能。

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return false
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive press: UIPress) -> Bool {
    return false

}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

答案 1 :(得分:2)

不要使用UIScreenEdgePanGestureRecognizer,而是让地图视图看不到靠近屏幕右边缘的触摸。这样,触摸将传递到滚动视图的UIPanGestureRecognizer

这是我的设置:

storyboard layout

(注意:图片中的视图框匹配约束。)

我有一个包含三个“页面”视图的滚动视图。第1页(“MapHolder”)包含地图视图作为子视图。第2页(“粉红色”)和第3页(“绿色”)只有标签子视图,背景颜色很容易看到。

视图大小受限制如下:

  • 第2页和第3页被限制为具有与根视图(滚动视图的超级视图)相同的宽度和高度。这意味着它们中的每一个都将填满屏幕。
  • 第1页(“MapHolder”)被约束为与根视图具有相同的高度,但被约束为根视图的宽度减去44.
  • 地图视图被限制为具有与其父视图相同的顶部,底部和前边缘,但宽度与根视图相同。

请注意,地图视图比其父视图宽(第1页)。第1页视图关闭了“剪辑子视图”(这是默认设置),因此位于第1页视图之外的地图部分仍然可见,但不会接收到触摸。

视图位置受到如下限制:

  • 滚动视图对根视图的所有四个边都有约束。这意味着滚动视图将填满屏幕。
  • Page 1从顶部,底部和前缘到滚动视图都有约束。
  • 第2页的前沿被限制在第1页的后缘加上44。
  • 第3页的前沿被约束为等于第2页的后缘。
  • 第3页的后缘被约束为等于滚动视图的后缘。
  • 第1,2和3页的垂直中心约束相等。

从页面视图到滚动视图的约束控制滚动视图的contentSize

最后,我为滚动视图打开了“Paging Enabled”。结果:

demo

我上传了我的故事板to this gist。只需将其放入一个新项目(替换现有的Main.storyboard)并与MapKit链接即可试用。