[英]Custom UIView: UIButton addTarget not called
我的問題是我有一個自定義UIView,它代表一個彈出窗口。 在此視圖內,我希望有一個滑塊,該滑塊的標簽每次我拖動滑塊時都會更新。 滑塊邏輯有效,至少在我直接在ViewController中使用滑塊邏輯時有效,但不適用於我的自定義視圖。 具體來說,根本不會調用addTarget中指定的方法。 我還嘗試將滑塊的backgroundColor設置為某種值,並且它實際上出現了,這意味着它具有框架。 那么,我在這里想念什么? 在自定義UIView子類中,UIButton等存在很多類似的問題。
class PriceVoteController: UIView {
var parentView: UIView = UIView()
let slider: UISlider = {
let slider = UISlider()
slider.isContinuous = true
slider.minimumValue = 1
slider.maximumValue = 3
slider.setMinimumTrackImage(#imageLiteral(resourceName: "minimumSliderTrackImage").resizableImage(withCapInsets: UIEdgeInsets(top: 0, left: 9, bottom: 0, right: 9)), for: .normal)
slider.setMaximumTrackImage(#imageLiteral(resourceName: "maximumSliderTrackImage").resizableImage(withCapInsets: UIEdgeInsets(top: 0, left: 9, bottom: 0, right: 9)), for: .normal)
let sliderThumb = #imageLiteral(resourceName: "sliderThumImage")
slider.setThumbImage(sliderThumb, for: .normal)
slider.addTarget(self, action: #selector(adjustPriceLabel), for: .valueChanged)
slider.setValue(2.0, animated: true)
return slider
}()
let priceLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
return label
}()
let blackView: UIView = {
let view = UIView()
view.backgroundColor = .black
view.alpha = 0.2
return view
}()
let popUpView: UIView = {
let view = UIView()
view.layer.backgroundColor = UIColor.white.cgColor
view.layer.cornerRadius = 10
return view
}()
@objc fileprivate func adjustPriceLabel() {
print("adjust label")
priceLabel.text = String(format: "%.1f", slider.value)
priceLabelLeftConstraint.constant = getXPositionForSliderValue()
}
fileprivate func getXPositionForSliderValue() -> CGFloat {
guard let currentThumbImage = slider.currentThumbImage else { return 0 }
let sliderRange = slider.frame.size.width - currentThumbImage.size.width;
let sliderOrigin = slider.frame.origin.x + (currentThumbImage.size.width / 2.0);
let sliderValueToPixels = ((CGFloat(slider.value - slider.minimumValue)/CGFloat(slider.maximumValue - slider.minimumValue)) * sliderRange) + sliderOrigin;
return sliderValueToPixels;
}
var priceLabelLeftConstraint: NSLayoutConstraint = NSLayoutConstraint()
override init(frame: CGRect) {
super.init(frame: frame)
self.isUserInteractionEnabled = true
}
fileprivate func setupSlider() {
self.popUpView.addSubview(slider)
slider.anchor(top: self.popUpView.topAnchor, left: self.popUpView.leftAnchor, bottom: nil, right: self.popUpView.rightAnchor, paddingTop: 10, paddingLeft: 50, paddingBottom: 0, paddingRight: 50, width: 0, height: 0)
self.popUpView.addSubview(priceLabel)
priceLabel.text = String(slider.value)
priceLabel.anchor(top: slider.bottomAnchor, left: nil, bottom: nil, right: nil, paddingTop: 10, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
priceLabelLeftConstraint = priceLabel.centerXAnchor.constraint(equalTo: self.popUpView.leftAnchor, constant: getXPositionForSliderValue())
priceLabelLeftConstraint.isActive = true
}
func showOn(view: UIView) {
parentView = view
parentView.addSubview(self.popUpView)
self.popUpView.anchor(top: nil, left: nil, bottom: nil, right: nil, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: view.frame.width - 100, height: 200)
self.popUpView.centerXAnchor.constraint(equalTo: parentView.centerXAnchor).isActive = true
self.popUpView.centerYAnchor.constraint(equalTo: parentView.centerYAnchor).isActive = true
setupSlider()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
我真的希望有人可以幫我解決這個問題,因為我在過去的幾個小時里一直在努力解決這個問題……而且沒有解決方案:/正如我所說,當所有內容都在ViewController及其視圖內部時,該方法將被調用,但不能使用自定義UIView。
順便說一句,parentView屬性是viewController的主視圖,自定義UIView在此初始化。 我用空的構造函數初始化它,然后用ViewController的視圖調用show()。
謝謝你的幫助! -羅伯特
因此,終於有了解決方案……對於面臨相同問題的每個人:查看您的視圖層次結構。 我缺少popUpView和customView之間的鏈接,這就是為什么未正確觸發觸摸事件的原因。 另一個錯誤是popUp從未正確錨定並且沒有自己的框架...這就是為什么滑塊根本不可操作的原因。 希望對您有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.