swift - 点击以编程方式创建的 UISlider
问题描述
我正在尝试 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的目标吗?
在控制台中打印出“滑块”时,它指出“滑块”未初始化。关于如何处理这个问题的任何思考?
解决方案
您不能为目标/选择器对中使用的选择器创建自己的任意签名。
更新您的选择器以仅采用手势。您可以从手势中获取滑块。
您还需要检查手势的状态。
更新您的设置:
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)
}
推荐阅读
- python - 转到“http://127.0.0.1:8000/restaurant/sign-in/”页面时出现找不到页面 (404) 错误
- javascript - 如何在 React js 中强制重新渲染导航栏组件的示例
- perl - Perl“Net::SFTP”模块的 SFTP 连接失败
- javascript - 元素隐式具有“任何”类型,因为类型“xxx”没有索引签名
- php - 如何登录到另一个网站并在后台维护会话,所以如果用户访问该网站,他们已经登录
- mysql - SQL UPDATES/INSERTS 在事务期间没有被阻塞
- docker - 有没有办法让 docker config 从容器内部编辑?
- android - 使用 webRTC 为视频通话响铃用户设备
- javascript - 从坐标存储在缓冲区中的Javascript裁剪图像
- javascript - 无法在浏览器中调试 React+Typescript。JS文件未在输出目录中生成