UISlider设定值

时间:2015-12-16 15:11:20

标签: ios swift user-interface uislider uianimation

我有一个UISlider,我想将其值设置为1到10.我使用的代码是。

let slider = UISlider()
slider.value = 1.0
// This works I know that
slider.value = 10.0

我想要做的是为UISlider设置动画,以便更改需要0.5秒。我不希望它变得更加流畅。

到目前为止我的想法是。

let slider = UISlider()
slider.value = 1.0
// This works I know that
UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveEaseInOut, animation: { slider.value = 10.0 } completion: nil)

我正在寻找Swift中的解决方案。

2 个答案:

答案 0 :(得分:8)

<强> EDITED

经过一番讨论,我认为我澄清了两种建议解决方案之间的差异:

  1. 使用内置的UISlider方法.setValue(10.0, animated: true)
  2. 将此方法封装在UIView.animateWithDuration
  3. 由于作者明确要求改变将花费0.5秒 - 可能由另一个动作触发 - 第二个解决方案是首选。

    作为示例,请考虑将按钮连接到将滑块设置为其最大值的操作。

    @IBOutlet weak var slider: UISlider!
    
    @IBAction func buttonAction(sender: AnyObject) {
        // Method 1: no animation in this context
        slider.setValue(10.0, animated: true)
    
        // Method 2: animates the transition, ok!
        UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveEaseInOut, animations: {
            self.slider.setValue(10.0, animated: true) },
            completion: nil)
    }
    

    仅使用UIVIewControllerUISlider对象运行一个简单的单UIButton个应用程序会产生以下结果。

    • Method 1:即时幻灯片(即使animated: true
    • Method 2:动画过渡。请注意,如果我们在此上下文中设置animated: false,则转换将是即时的。

答案 1 :(得分:1)

@ dfri的答案问题是蓝色最小追踪器正在从100%移动到该值,所以为了解决这个问题,你需要稍微改变一下方法:

extension UISlider
{
  ///EZSE: Slider moving to value with animation duration
  public func setValue(value: Float, duration: Double) {
    UIView.animateWithDuration(duration, animations: { () -> Void in
      self.setValue(self.value, animated: true)

      }) { (bol) -> Void in
        UIView.animateWithDuration(duration, animations: { () -> Void in
          self.setValue(value, animated: true)
          }, completion: nil)
    }
  }
}