【发布时间】:2016-12-23 03:28:39
【问题描述】:
所以我有一个包含 UIScrollview 的 UIView。滚动视图内部是一个 UIViews 数组,每个都包含一个 UILabel 和一个 UIButton。我想让它在滚动视图内的视图内触摸然后拖动按钮仍会滚动,因为默认情况下并非如此。
我对 iOS 编程还很陌生,所以这可能是一个愚蠢的问题,请原谅。
【问题讨论】:
标签: ios swift uiview uiscrollview uibutton
所以我有一个包含 UIScrollview 的 UIView。滚动视图内部是一个 UIViews 数组,每个都包含一个 UILabel 和一个 UIButton。我想让它在滚动视图内的视图内触摸然后拖动按钮仍会滚动,因为默认情况下并非如此。
我对 iOS 编程还很陌生,所以这可能是一个愚蠢的问题,请原谅。
【问题讨论】:
标签: ios swift uiview uiscrollview uibutton
事实证明这很容易。我从这个问题的一个答案中得到了答案:UIButton touch is delayed when in UIScrollView
您需要做的是子类化您的 UIScrollview,然后粘贴以下代码:
override func touchesShouldCancelInContentView(view: UIView) -> Bool {
if view is UIButton {
return true
}
return super.touchesShouldCancelInContentView(view)
}
重要提示:您需要让您的内容触摸可取消,并且“延迟内容触摸”需要为 false。您可以通过将 scrollview.delaysContentTouches 设置为 false 在代码中或在 Interface Builder 中的 Scrollview 属性中执行此操作:
【讨论】:
我在表格单元格内的容器视图中嵌入了按钮和标签时遇到了类似的问题。按钮正在拦截触摸事件。
如果您不需要按钮在按下时突出显示,那么我所做的就是使用 UIView 和点击 手势识别器 而不是按钮。
let fakeButtonView = UIView()
fakeButtonView.translatesAutoresizingMaskIntoConstraints = false
fakeButtonView.backgroundColor = UIColor.whiteColor()
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(buttonTapped))
fakeButtonView.addGestureRecognizer(gestureRecognizer)
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.text = ...
label.numberOfLines = 1
label.textAlignment = .Center
label.lineBreakMode = .ByTruncatingTail
label.minimumScaleFactor = 0.5
label.font = UIFont.systemFontOfSize(17.0)
fakeButtonView.addSubview(label)
fakeButtonView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-5-[label]-5-|",
options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["label": label]))
fakeButtonView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[label]|",
options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["label": label]))
container.addSubview(fakeButtonView)
// Constraints from button to container
//
// ...
【讨论】: