请在下面查看我的视图层次结构的简化版本。滚动视图具有清晰的背景并覆盖两个按钮(1& 2):
UIView
| UIView
| UIButton 1
| UIButton 2
| UIScrollView (pinned to the superview edges - clear color)
一开始,当滚动视图覆盖按钮时,我没有接收到按钮的轻击手势。所以我尝试将滚动视图放在容器视图中并覆盖pointInside
方法。
class PassThroughView: UIView {
//...
var buttons = [UIView]()
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return buttons.all { view in
return view.isHidden ||
!view.isUserInteractionEnabled ||
!view.point(inside: convert(point, to: view), with: event)
}
}
}
PassThoughView
按住按钮数组(1& 2)。新的层次结构变为:
UIView
| UIView
| UIButton 1
| UIButton 2
| PassThoughView (pinned to the superview edges - clear color)
| UIScrollView (pinned to the superview edges - clear color)
这解决了问题的第一部分。我能够点击按钮并拖动滚动视图。
不好的部分是我不能再滚动了,除非我开始在按钮外面拖动。按钮有点大,这使得体验不是很友好。
是否有办法允许点击手势遍历滚动视图并允许滚动视图接收平移手势,即使触摸在其中一个按钮内开始
修改
我希望这些图片可以解释一下这是什么目的。我需要在所有视图上放置一个滚动视图,以便我可以增加可滚动区域。 (这对我的情况非常具体)。用户可能想要在拍摄照片按钮内启动滚动,如果拍摄手势,我们会拍照。
答案 0 :(得分:0)
如果我理解你的问题,你需要手势依赖。 UIScollView的平移手势应该比UIButton的手势更高。
在UIButton的情况下我还不知道如何解决它,因为UIButton是不使用UIGestureRecognizer的UIControl。但是如果你使用自己的UIView和UITapGestureRecognizer,那么它应该是可能的。
使用属性从UIScrollView获取UIPanGestureRecognizer
var panGestureRecognizer: UIPanGestureRecognizer { get }
请参阅here
现在,您可以使用
组合两个识别器 func require(toFail otherGestureRecognizer: UIGestureRecognizer)
请参阅here
最终的代码行应如下所示:
tapGestureRecognizer.require(toFail: panGestureRecognizer)