我正在使用UIScrollView
和UIStackView
进行水平滚动并选择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)
}
问题是,当您点击类型为colorView
的UIControl
时,该点击无法正常工作。似乎有冻结现象,并且仅在关闭视图时才起作用。基本上,您点击一种颜色,然后什么都没有发生,那么当您关闭视图时,该点击就会注册并开始工作。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
}()
用例可以在颜色上滚动并点击它们以突出显示文本。
A UIGestureRecognizer
将用于单个视图。 @TomSwift回答。我认为这适用于您使用多个视图的情况。仅将addTarget
或addGestureRecognizer
设置为一个视图。
[如果使用多重视图,例如在UIControl
内有UIStackView
而在UIStackView
内有UIScrollView
的情况下,则需要确保addTarget
或addGestureRecognizer
仅仅设置为views
之一。
由于您希望UIControl
响应轻敲,因此只需要在此视图上设置addTarget
,而无需在UIScrollView
和/或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
。您是否使用UIViewController
用颜色显示堆栈视图?如果是这样,请尝试在viewDidLoad
功能中添加颜色控件,而不是UIStackView
的初始化程序。假设您正确设置了滚动视图,并向其中添加了堆栈视图。
func viewDidLoad() {
super.viewDidLoad()
for color in colors {
let colorView = HighlightColorView()
colorView.backgroundColor = color
colorView.addTarget(self, action: #selector(handleColorTap(_:)), for: .touchUpInside)
colorsStackView.addArrangedSubview(colorView)
}
}
UIScrollView
和UIStackView
的属性isUserInteractionEnabled
都默认设置为true
,因此无需添加它们。