Swift:UIScrollView 和 UIControl - 添加目标 | addGestureRecognizer - 未按预期工作
Swift: UIScrollView & UIControl - addTarget | addGestureRecognizer - Not working as expected
我正在使用 UIScrollView
和 UIStackView
水平滚动,select 一个 UIControl
元素。
我在 UIControl
元素上设置了 addTarget,如下所示在 UIStackView
中:
即 HighlightColorView
的类型是 UIControl
lazy var colorsStackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.distribution = .fillEqually
stackView.isUserInteractionEnabled = true
stackView.alignment = .center
stackView.spacing = 12
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.isUserInteractionEnabled = true
for color in colors {
let colorView = HighlightColorView()
colorView.backgroundColor = color
colorView.addTarget(self, action: #selector(self.handleColorTap(_:)), for: .touchUpInside)
stackView.addArrangedSubview(colorView)
}
return stackView
}()
@objc func handleColorTap(_ sender: UIView) {
highlightSelectionDelegate.didTapColor(colorView: sender, mainView: self)
let viewBackgroundColor = sender.backgroundColor ?? .black
print("", viewBackgroundColor)
}
问题是,当您点击类型为 UIControl
的 colorView
时,点击无法按预期工作。似乎有一个冻结,它只在视图被关闭时才有效。
基本上,您点击一种颜色,然后当您关闭视图时什么也没有发生,然后点击注册并开始工作。
这似乎是 scrollView 的问题,但我不确定。
执行 scrollView
:
lazy var scrollView: UIScrollView = {
let scView = UIScrollView()
scView.contentInset = UIEdgeInsets(top: 0, left: 12, bottom: 0, right: 12)
scView.showsHorizontalScrollIndicator = false
scView.translatesAutoresizingMaskIntoConstraints = false
scView.isUserInteractionEnabled = true
scView.delaysContentTouches = false
return scView
}()
用例它能够滚动颜色并点击它们以突出显示文本。
我注意到的一件事是您可能指的是 UITapGestureRecognizer
。如果您单独使用 UIGestureRecognizer
,那么它将不起作用。
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleColorTap))
view.addGestureRecognizer(tapRecognizer)
回答您提出的问题
A UIGestureRecognizer
将与单个视图一起使用。 @TomSwift 的回答。
我认为这适用于您使用多个视图的情况。将 addTarget
或 addGestureRecognizer
设置为只有一个视图。
如果您正在使用多个视图,例如您在 UIStackView
中有一个 UIControl
并且在 UIScrollView
中有一个 UIStackView
,您需要制作确保 addTarget
或 addGestureRecognizer
仅设置为 views
之一。
由于您希望 UIControl
响应点击,因此您需要仅在此视图上设置 addTarget
而不是 UIScrollView
and/or UIStackView
.
for color in colors {
let colorView = HighlightColorView()
colorView.backgroundColor = color
colorView.addTarget(self, action: #selector(handleColorTap(_:)), for: .touchUpInside)
colorsStackView.addArrangedSubview(colorView)
}
注意:您不必将代码放在 viewDidLoad
函数中,放在什么地方都可以。只需从您的视图中删除其他 addTarget
或 addGestureRecognizer
。
我正在使用 UIScrollView
和 UIStackView
水平滚动,select 一个 UIControl
元素。
我在 UIControl
元素上设置了 addTarget,如下所示在 UIStackView
中:
即 HighlightColorView
的类型是 UIControl
lazy var colorsStackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.distribution = .fillEqually
stackView.isUserInteractionEnabled = true
stackView.alignment = .center
stackView.spacing = 12
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.isUserInteractionEnabled = true
for color in colors {
let colorView = HighlightColorView()
colorView.backgroundColor = color
colorView.addTarget(self, action: #selector(self.handleColorTap(_:)), for: .touchUpInside)
stackView.addArrangedSubview(colorView)
}
return stackView
}()
@objc func handleColorTap(_ sender: UIView) {
highlightSelectionDelegate.didTapColor(colorView: sender, mainView: self)
let viewBackgroundColor = sender.backgroundColor ?? .black
print("", viewBackgroundColor)
}
问题是,当您点击类型为 UIControl
的 colorView
时,点击无法按预期工作。似乎有一个冻结,它只在视图被关闭时才有效。
基本上,您点击一种颜色,然后当您关闭视图时什么也没有发生,然后点击注册并开始工作。
这似乎是 scrollView 的问题,但我不确定。
执行 scrollView
:
lazy var scrollView: UIScrollView = {
let scView = UIScrollView()
scView.contentInset = UIEdgeInsets(top: 0, left: 12, bottom: 0, right: 12)
scView.showsHorizontalScrollIndicator = false
scView.translatesAutoresizingMaskIntoConstraints = false
scView.isUserInteractionEnabled = true
scView.delaysContentTouches = false
return scView
}()
用例它能够滚动颜色并点击它们以突出显示文本。
我注意到的一件事是您可能指的是 UITapGestureRecognizer
。如果您单独使用 UIGestureRecognizer
,那么它将不起作用。
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleColorTap))
view.addGestureRecognizer(tapRecognizer)
回答您提出的问题
A UIGestureRecognizer
将与单个视图一起使用。 @TomSwift 的回答。
我认为这适用于您使用多个视图的情况。将 addTarget
或 addGestureRecognizer
设置为只有一个视图。
如果您正在使用多个视图,例如您在 UIStackView
中有一个 UIControl
并且在 UIScrollView
中有一个 UIStackView
,您需要制作确保 addTarget
或 addGestureRecognizer
仅设置为 views
之一。
由于您希望 UIControl
响应点击,因此您需要仅在此视图上设置 addTarget
而不是 UIScrollView
and/or UIStackView
.
for color in colors {
let colorView = HighlightColorView()
colorView.backgroundColor = color
colorView.addTarget(self, action: #selector(handleColorTap(_:)), for: .touchUpInside)
colorsStackView.addArrangedSubview(colorView)
}