2015-12-16 46 views
-2

我有一个UISlider,我想设置它的值从1到10.我使用的代码是。UISlider设定值

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

我想要做的是动画UISlider,以便它需要0.5s来改变。我不想让它变得更加平滑。

我到目前为止的想法是。

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中的解决方案。

+1

你看过“UISlider”的文档吗?有一种用动画设置值的方法。 – rmaddy

+0

这个问题基本上是http://stackoverflow.com/questions/20539913/uiview-animatewithduration-not-working-with-uislider的副本,只是答案(尽可能简单)在Objective-C中。 – rmaddy

+0

@rmaddy谢谢你的一切,我觉得你已经为我回答了很多问题。你非常慷慨的时间和帮助人们在这里,我很欣赏这一点。 –

回答

4

EDITED

经过一番讨论后,我想我应该澄清这两个建议的解决方案之间的差异:

  1. 使用内置UISlider方法.setValue(10.0, animated: true)
  2. 将此方法封装在UIView.animateWithDuration中。

由于作者明确要求一个需要0.5s的变化---可能由另一个动作引发---第二个解决方案是更喜欢。

作为一个例子,考虑一个按钮连接到将滑块设为其最大值的动作。

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

运行只与UISliderUIButton对象存在的产率,结果如下一个简单的单UIVIewController应用程序。

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

为什么不直接使用'UISlider'提供的方法来动态改变值呢? – rmaddy

+1

查看@rmaddy的评论 –

+0

谢谢你们,我发现它,答案已被编辑。 –

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