点击以编程方式创建的 UISlider

Posted

技术标签:

【中文标题】点击以编程方式创建的 UISlider【英文标题】:Tap on UISliders created programmatically 【发布时间】:2018-05-14 21:33:13 【问题描述】:

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

在 viewDidLoad() 中,'slider' 定义为在 For... 语句中运行的 UISlider 集合中的任何 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)

另外,“slider”被添加到“assessView”下的子视图中——这应该是taprecogniser的目标吗?

在控制台中打印出“滑块”时,它指出“滑块”未初始化。关于如何处理这个问题的任何思考?

【问题讨论】:

【参考方案1】:

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

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

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

更新您的设置:

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)

【讨论】:

感谢 rmaddy - 有道理!明天试试看! 这行得通!这里有更简单的代码:guard gesture.state == .ended else return guard let slider = gesture.view as? UISlider else return let pointTapped = gesture.location(in: slider) let value = Float(pointTapped.x / slider.bounds.size.width) slider.setValue(Float(value), animated: true)【参考方案2】:

根据UIGestureRecognizer 文档(here):

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

@IBAction func myActionMethod()
@IBAction func myActionMethod(_ sender: UIGestureRecognizer)

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

【讨论】:

感谢 Adri - 将尝试 rmaddy a 提出的具体解决方案并回来。

以上是关于点击以编程方式创建的 UISlider的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建与点击按钮关联的标签

更改以编程方式创建的单击 UIButton 的背景图像

以编程方式创建 VC,使用公式中文本字段中的整数并在点击 UIButton 时执行计算

如何将 UIPopover 附加到以编程方式创建的 CGRect

如何以编程方式创建带有内容的 UIImage [关闭]

如何更改以编程方式创建的一组 UIButton 的标题颜色?