• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 如何防止 UISlider 在捕捉/步进时跳到位

[复制链接]
菜鸟教程小白 发表于 2022-12-11 20:43:24 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个可以卡入 5 个不同位置的 UISlider。

slider.minimumValue = 1
slider.maximumValue = 5

卡扣工作正常,但它很突然并且不能顺利卡入到位。它有点“跳”到位

我尝试为滚动设置动画(没用):

@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)
}

我怎样才能使 slider 平滑滚动但仍卡入到位?

这是没有进行上述尝试的原始代码:

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
}



Best Answer-推荐答案


一个 UISlider 使用多个 UIImageView subview 绘制自己。当您更改 slider 的 value 时, slider 会向自己发送 setNeedsLayout,但在收到 layoutSubviews 之前,它实际上不会更改其 subview 的框架在运行循环的布局阶段。

要为值的变化设置动画,您需要使 slider 在动画 block 中布置其 subview 。因此:

@IBAction func sliderValueChanged(_ slider: UISlider) {
    slider.value = round(slider.value)
    UIView.animate(withDuration: 0.2, animations: {
        slider.layoutIfNeeded()
    })
}

关于ios - 如何防止 UISlider 在捕捉/步进时跳到位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52973411/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap