[英]Swift: UIScrollView & UIControl - addTarget | addGestureRecognizer - Not working as expected
我正在使用UIScrollView
和UIStackView
來水平滾動並選擇一個UIControl
元素。
我在UIStackView
內的UIControl
元素上設置了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
使用UIGestureRecognizer
,那么它將無法工作。
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleColorTap))
view.addGestureRecognizer(tapRecognizer)
回答你提出的問題
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
從你的觀點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.