自定义 UIView:未调用 UIButton addTarget

Posted

技术标签:

【中文标题】自定义 UIView:未调用 UIButton addTarget【英文标题】:Custom UIView: UIButton addTarget not called 【发布时间】:2017-10-15 21:55:57 【问题描述】:

我的问题是我有一个自定义 UIView,它代表一个弹出窗口。在这个视图中,我想要一个滑块,它有一个标签,每次我拖动滑块时都会更新。滑块逻辑有效,至少当我直接在 ViewController 中使用它时,但不适用于我的自定义视图。具体来说, addTarget 中指定的方法根本不会被调用。我还尝试将滑块的背景颜色设置为某种东西,它实际上出现了,这意味着它有一个框架。那么,我在这里缺少什么?在自定义 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 添加到自定义 UIView...所以我这样做了,现在滑块根本不动,我可以在自定义视图“后面”触发触摸事件...所以它背后的视图控制器的事件...有人可以帮忙吗? 【参考方案1】:

所以,我终于找到了解决方案……对于面临相同问题的每个人:查看您的视图层次结构。我错过了我的 popUpView 和我的 customView 之间的链接,这就是为什么触摸事件没有正确触发的原因。另一个错误是弹出窗口从未正确锚定并且没有自己的框架......这就是滑块根本不可操作的原因。 我希望这对你们中的一些人有所帮助!

【讨论】:

以上是关于自定义 UIView:未调用 UIButton addTarget的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 未显示在自定义 UIView 中

未设置自定义 UIView iboutlet

在自定义 UIView 上为 UIButton 设置动画

自定义 UIView addTarget?

未调用自定义 UIButton 的 setIsSelected 方法

Swift:在自定义视图中未调用 UIButton 触摸事件