点击以编程方式创建的UISliders

时间:2018-05-14 21:33:14

标签: swift uislider uitapgesturerecognizer

正如Diogo在Tap on UISlider to Set the Value中所建议的那样在Swift 4中尝试解决方案 - 在一组以编程方式定义的UISliders上,但我无法引用UISlider内部的Selector。

在viewDidLoad()中使用'滑块'定义为在For ...语句中运行的UISliders集合中的任何UISlider:

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(sliderTapped(_: slider:)))
slider.addGestureRecognizer(tapGestureRecognizer)

选择器:

@objc func sliderTapped(_ gestureRecognizer:UIGestureRecognizer, slider:UISlider) {

    let pointTapped: CGPoint = gestureRecognizer.location(in: assessView)        
    let positionOfSlider: CGPoint = slider.convert(slider.bounds.origin, to: assessView)
    let widthOfSlider: CGFloat = slider.bounds.size.width

    let moveDistance = sqrt(Double(pow(Double(pointTapped.x - positionOfSlider.x),2) + pow(Double(pointTapped.y - positionOfSlider.y),2)))

    var newValue: CGFloat
    if pointTapped.x < 10 {
        newValue = 0
    } else {
        newValue = (CGFloat(moveDistance) * CGFloat(slider.maximumValue) / widthOfSlider)
    }

    slider.setValue(Float(newValue), animated: true)
}

此外,&#39;滑块&#39;被添加到&评估视图下的子视图中。 - 这应该是taprecogniser的目标吗?

打印出&#39;滑块&#39;在控制台中它说明了“滑块”#39;没有初始化。关于如何处理这个的任何反思?

2 个答案:

答案 0 :(得分:0)

根据@IBAction func myActionMethod() @IBAction func myActionMethod(_ sender: UIGestureRecognizer) 文档(_conv):

  

调用的操作方法必须符合以下签名之一:

view

如果您没有将识别器的相同实例添加到其他视图,则可以通过访问识别器的{{1}}属性来获取滑块。

答案 1 :(得分:0)

您无法为目标/选择器对中使用的选择器创建自己的任意签名。

更新您的选择器以仅拍摄手势。您可以从手势中获取滑块。

您还需要检查手势的状态。

更新您的设置:

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(sliderTapped))
slider.addGestureRecognizer(tapGestureRecognizer)

然后更新你的方法:

@objc func sliderTapped(_ gesture: UITapGestureRecognizer) {
    guard gesture.state == .ended else { return }
    guard let slider = gesture.view as? UISlider else { return }

    let pointTapped: CGPoint = gesture.location(in: assessView)        
    let positionOfSlider: CGPoint = slider.convert(slider.bounds.origin, to: assessView)
    let widthOfSlider: CGFloat = slider.bounds.size.width

    let moveDistance = sqrt(Double(pow(Double(pointTapped.x - positionOfSlider.x),2) + pow(Double(pointTapped.y - positionOfSlider.y),2)))

    var newValue: CGFloat
    if pointTapped.x < 10 {
        newValue = 0
    } else {
        newValue = (CGFloat(moveDistance) * CGFloat(slider.maximumValue) / widthOfSlider)
    }

    slider.setValue(Float(newValue), animated: true)
}