点击以编程方式创建的 UISliders
Tap on UISliders created programmatically
我正在按照 Diogo 在 中的建议尝试 Swift 4 中的解决方案 - 在一组以编程方式定义的 UISlider 上,但我无法在选择器中引用 UISlider。
在 viewDidLoad() 中,'slider' 定义为 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)
}
此外,'slider' 被添加到 'assessView' 下的子视图中 - 这应该是 taprecogniser 的目标吗?
当在控制台中打印出 'slider' 时,它指出 'slider' 未初始化。关于如何处理这个问题有什么想法吗?
根据 UIGestureRecognizer
文档 (here):
The action methods invoked must conform to one of the following signatures:
@IBAction func myActionMethod()
@IBAction func myActionMethod(_ sender: UIGestureRecognizer)
如果您没有将相同的识别器实例添加到其他视图,您可以通过访问识别器的 view
属性 来获取滑块。
您不能为 target/selector 对中使用的选择器创建自己的任意签名。
更新您的选择器以仅采用手势。您可以从手势中获取滑块。
您还需要检查手势的状态。
更新您的设置:
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)
}
我正在按照 Diogo 在
在 viewDidLoad() 中,'slider' 定义为 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)
}
此外,'slider' 被添加到 'assessView' 下的子视图中 - 这应该是 taprecogniser 的目标吗?
当在控制台中打印出 'slider' 时,它指出 'slider' 未初始化。关于如何处理这个问题有什么想法吗?
根据 UIGestureRecognizer
文档 (here):
The action methods invoked must conform to one of the following signatures:
@IBAction func myActionMethod() @IBAction func myActionMethod(_ sender: UIGestureRecognizer)
如果您没有将相同的识别器实例添加到其他视图,您可以通过访问识别器的 view
属性 来获取滑块。
您不能为 target/selector 对中使用的选择器创建自己的任意签名。
更新您的选择器以仅采用手势。您可以从手势中获取滑块。
您还需要检查手势的状态。
更新您的设置:
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)
}