snapping/stepping 如何防止 UISlider 跳到位
How to prevent UISlider from jumping into place while snapping/stepping
我有一个可以卡入 5 个不同位置的 UISlider。
slider.minimumValue = 1
slider.maximumValue = 5
卡扣工作正常,但它很突然,无法顺利卡入到位。它有点 "jumps" 到位
我试过设置滚动动画(没用):
@objc func onSliderValChanged(_ sender: UISlider) {
UIView.animate(withDuration: 0.5) {
self.slider.value = round(sender.value)
self.slider.setValue(round(sender.value), animated: true)
}
}
我也试过添加 panGesture(没用):
panGesture = UIPanGestureRecognizer(target: self, action: #selector(panGestureHandler(_:)))
slider.addGestureRecognizer(panGesture)
@objc func panGestureHandler(_ recognizer: UIPanGestureRecognizer){
let currentPoint = recognizer.location(in: slider)
let percentage = currentPoint.x/slider.bounds.size.width
let delta = Float(percentage) * (slider.maximumValue - slider.minimumValue)
let value = slider.minimumValue + delta
slider.setValue(round(value), animated: true)
}
如何实现滑块平滑滚动但仍卡入到位?
这是没有进行上述尝试的原始代码:
let slider: UISlider = {
let slider = UISlider()
slider.translatesAutoresizingMaskIntoConstraints = false
slider.minimumValue = 1
slider.maximumValue = 5
slider.value = 3
slider.isContinuous = true
slider.addTarget(self, action: #selector(onSliderValChanged(_:)), for: .valueChanged)
return slider
}()
@objc func onSliderValChanged(_ sender: UISlider) {
slider.value = round(sender.value)
}
func setAnchors() {
slider.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
slider.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 10).isActive = true
slider.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -10).isActive = true
}
A UISlider
使用几个 UIImageView
子视图绘制自己。当您更改滑块的 value
时,滑块会发送自身 setNeedsLayout
,但它实际上不会更改其子视图的框架,直到它在 [=20] 的布局阶段接收到 layoutSubviews
=]循环。
要为值的变化设置动画,您需要使滑块在动画块内布置其子视图。因此:
@IBAction func sliderValueChanged(_ slider: UISlider) {
slider.value = round(slider.value)
UIView.animate(withDuration: 0.2, animations: {
slider.layoutIfNeeded()
})
}
我有一个可以卡入 5 个不同位置的 UISlider。
slider.minimumValue = 1
slider.maximumValue = 5
卡扣工作正常,但它很突然,无法顺利卡入到位。它有点 "jumps" 到位
我试过设置滚动动画(没用):
@objc func onSliderValChanged(_ sender: UISlider) {
UIView.animate(withDuration: 0.5) {
self.slider.value = round(sender.value)
self.slider.setValue(round(sender.value), animated: true)
}
}
我也试过添加 panGesture(没用):
panGesture = UIPanGestureRecognizer(target: self, action: #selector(panGestureHandler(_:)))
slider.addGestureRecognizer(panGesture)
@objc func panGestureHandler(_ recognizer: UIPanGestureRecognizer){
let currentPoint = recognizer.location(in: slider)
let percentage = currentPoint.x/slider.bounds.size.width
let delta = Float(percentage) * (slider.maximumValue - slider.minimumValue)
let value = slider.minimumValue + delta
slider.setValue(round(value), animated: true)
}
如何实现滑块平滑滚动但仍卡入到位?
这是没有进行上述尝试的原始代码:
let slider: UISlider = {
let slider = UISlider()
slider.translatesAutoresizingMaskIntoConstraints = false
slider.minimumValue = 1
slider.maximumValue = 5
slider.value = 3
slider.isContinuous = true
slider.addTarget(self, action: #selector(onSliderValChanged(_:)), for: .valueChanged)
return slider
}()
@objc func onSliderValChanged(_ sender: UISlider) {
slider.value = round(sender.value)
}
func setAnchors() {
slider.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
slider.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 10).isActive = true
slider.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -10).isActive = true
}
A UISlider
使用几个 UIImageView
子视图绘制自己。当您更改滑块的 value
时,滑块会发送自身 setNeedsLayout
,但它实际上不会更改其子视图的框架,直到它在 [=20] 的布局阶段接收到 layoutSubviews
=]循环。
要为值的变化设置动画,您需要使滑块在动画块内布置其子视图。因此:
@IBAction func sliderValueChanged(_ slider: UISlider) {
slider.value = round(slider.value)
UIView.animate(withDuration: 0.2, animations: {
slider.layoutIfNeeded()
})
}