我有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
。
这是我的设置:
(注意:图片中的视图框架与不匹配约束。)
我有一个包含三个“页面”视图的滚动视图。页面1(“MapHolder”)包含地图视图作为子视图。第2页(“粉红色”)和第3页(“绿色”)仅具有标签子视图,并具有背景色以使其易于查看。
视图大小受以下约束:
因此请注意,地图视图比其父视图宽(第1页)。第1页视图的“剪辑子视图”处于关闭状态(这是默认设置),因此地图中位于第1页视图之外的部分仍然可见,但不会收到任何触摸。
视图位置受以下约束:
从页面视图到滚动视图的约束控制滚动视图的
contentSize
。最后,我打开了滚动视图的“Paging Enabled”。结果:
我已经上传了情节提要to this gist。只需将其放在一个新项目中(替换现有的Main.storyboard),然后与MapKit链接进行尝试即可。