我有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)
}

最佳答案

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

这是我的设置:

ios - UIScrollView中的UIScreenEdgePanGestureRecognizer-LMLPHP

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

我有一个包含三个“页面”视图的滚动视图。页面1(“MapHolder”)包含地图视图作为子视图。第2页(“粉红色”)和第3页(“绿色”)仅具有标签子视图,并具有背景色以使其易于查看。

视图大小受以下约束:

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

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

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

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

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

    ios - UIScrollView中的UIScreenEdgePanGestureRecognizer-LMLPHP

    我已经上传了情节提要to this gist。只需将其放在一个新项目中(替换现有的Main.storyboard),然后与MapKit链接进行尝试即可。

    10-07 15:00