2017-10-15 11 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()를 호출합니다.

도움 주셔서 감사합니다. - 로버트

+0

방금 ​​만든 팝업 뷰를 사용자 정의 UIView에 추가하지 않은 것을 보았습니다 ... 그래서 이제 슬라이더가 움직이지 않고 터치 이벤트를 "사용자 정의보기"뒤에 트리거 할 수 있습니다 ... 그래서 이벤트 그것 뒤에 viewcontroller에서 ... 누군가 도울 수 있습니까? –

답변

0

결국, 나는 해결책을 얻었습니다. 같은 문제를 안고있는 모든 사람들에게 : 당신의 뷰 계층 구조를보십시오. 내 popUpView와 내 customView 사이의 linkn이 누락되었습니다. 터치 이벤트가 제대로 트리거되지 않은 이유입니다. 또 다른 실수는 팝업이 제대로 고정되지 않았고 자체 프레임이 없었기 때문입니다. 그래서 슬라이더가 전혀 작동하지 않는 것입니다. 이것이 여러분 중 일부에게 도움이되기를 바랍니다.