2017-10-15 15 views
0

私の問題は、私はカスタムのUIViewがポップアップを表していることです。このビューの中にスライダを置いておきます。このスライダには、スライダをドラッグするたびに更新されるラベルがあります。スライダーロジックは、少なくとも私がViewControllerで直接使用しているときは機能しますが、カスタムビューでは使用できません。具体的には、addTargetで指定されたメソッドはまったく呼び出されません。私はまた、スライダのbackgroundColorを何かに設定しようとしましたが、実際にはそれが現れてフレームがあることを意味していました。では、私はここで何が欠けていますか?カスタムのUIViewサブクラスでUIButtonなどで同様の問題が発生しました。カスタムUIView:UIButton addTargetが呼び出されていない

私は本当に...私は過去の時間のためにこれを理解しようとしてきたように、誰かがこれで私を助けることができることを願っていないと何も解決
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プロパティは、カスタムUIViewが初期化されるviewControllerのメインビューです。私はそれを空のコンストラクタで初期化し、ViewControllerのビューでshow()を呼び出します。

ありがとうございました! - Robert

+0

私は、カスタムUIViewにpopupViewを追加したことがないことを知りました...だから、私はこれを行い、スライダはまったく動かず、カスタムビューの背後にタッチイベントを引き起こすことができます...イベントその背後のビューコントロールから...誰かを助けることができますか? –

答えて

0

だから、私は解決策を得ました...同じ問題に直面しているすべての人に:あなたのビュー階層を見てください。私は私のpopUpViewと私のcustomViewの間のリンクを見逃していた、それはタッチイベントが適切にトリガされなかった理由です。もう一つの間違いは、ポップアップが決して適切に固定されておらず、独自のフレームを持たないということでした。そのため、スライダは全く操作できませんでした。 これは皆さんのお役に立てば幸いです!

関連する問題