UIButtons 上方的 UIScrollView
Posted
技术标签:
【中文标题】UIButtons 上方的 UIScrollView【英文标题】:UIScrollView above UIButtons 【发布时间】:2018-03-21 20:20:09 【问题描述】:请在下面查看我的视图层次结构的简化版本。滚动视图具有清晰的背景并覆盖了两个按钮(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)
这解决了问题的第一部分。我能够点击按钮以及拖动滚动视图。
不好的部分是我不能再滚动,除非我开始在按钮外拖动。按钮有点大,体验不太友好。
有没有办法允许点击手势遍历滚动视图并允许滚动视图接收平移手势,即使触摸是在其中一个按钮内开始的
编辑:
我希望图片能稍微解释一下这样做的目的是什么。我需要在所有视图上放置一个滚动视图,以便增加可滚动区域。 (这对我的情况非常具体)。用户可能希望在拍照按钮内启动滚动,如果手势是点击,我们会拍照。
【问题讨论】:
我们可以回去一点吗?你到底为什么要在希望用户能够点击的按钮的front 中放置一个滚动视图?您真正想通过这个非常奇怪的界面来完成什么?也许有更好的方法来完成它。 :) 例如,很容易将按钮放在滚动视图的前面,而不允许它们在滚动时移动。那不就解决问题了吗?它不是一个更易于理解的界面吗? @matt 我已经编辑了这个问题。希望现在有意义 对于 ios 应用来说,这是一个不寻常的 UX。基本上没有人希望从一个按钮开始滚动,只滚动后面的视图,而按钮保持在同一位置。 【参考方案1】:如果我理解你的问题,你需要一个手势依赖。 UIScollView 的平移手势应该比 UIButton 的点击手势具有更高的优先级。
如果是 UIButton,我还不知道如何解决它,因为 UIButton 是 UIControl,而不使用 UIGestureRecognizer。但是,如果您将自己的 UIView 与 UITapGestureRecognizer 一起使用,则应该可以。
使用属性从 UIScrollView 中获取 UIPanGestureRecognizer
var panGestureRecognizer: UIPanGestureRecognizer get
见here
现在您可以使用
组合这两个识别器func require(toFail otherGestureRecognizer: UIGestureRecognizer)
见here
最后的代码行应该是这样的:
tapGestureRecognizer.require(toFail: panGestureRecognizer)
【讨论】:
以上是关于UIButtons 上方的 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章