为什么我的UISlider没有动画效果?

16
根据苹果公司的documentation,可以通过编程方式平稳地设置UISlider的值。我正在尝试从自定义视图控制器中执行此操作,UI是从故事板中定义的。 背景 在我的示例中,我正在尝试从自定义视图控制器中更新滑块的值,UI是从故事板中定义的。该示例仅呈现一个滑块。
当用户释放滑块时,该值将重置为0代码
import UIKit

class ViewController: UIViewController {

    @IBOutlet var mySlider: UISlider!
    @IBAction func resetSlider() {
        mySlider.setValue(0, animated:true)
        NSLog("Reset!")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

resetSliderTouch Up Inside事件相关联。

问题

当调用resetSlider时,界面上的值确实发生了变化,但是它没有进行动画(该值只是“跳”到0)。我的目标是让该值优雅地回到零。

注意:“Reset!”每次仅显示一次(每次点击),这表明resetSlider并未被多次调用。

为什么这个UISlider不进行动画呢?

视频

由于IB非常直观,这里是一个视频密码是code

2个回答

53

setValue方法的animated参数实际上并不执行动画,而是启用动画。

要触发动画,您需要使用UIView.animateWithDuration方法,并将setValue命令作为动画传入:

UIView.animateWithDuration(0.2, animations: {
  self.mySlider.setValue(0, animated:true)
})

Swift 5

UIView.animate(withDuration: 0.2, animations: {
  self.mySlider.setValue(0, animated:true)
})

伟大的想法 - 唉,根据我的NSLog输出,它只被调用了一次! - slifty
如果您使用动画块(请参见编辑后的答案),会出现什么情况?早期版本中滑块动画存在问题,不确定是否可能是问题所在。此外,它在iOS 7和iOS 8上都失败了吗? - f3n1kc
很遗憾这个回答被踩了,因为它实际上解决了问题。看起来在滑块的IBAction中使用setValue:animated:不会执行动画,这可能是UIKit的一个bug。 - rob mayoff
这很快就会被标记为答案,但我建议编辑一下以充实一些内容。 - slifty

0
@Slifty的解决方案是正确的。但是,如果您希望UISlider像默认情况下一样平滑,那么您可以将动画时间减少到0.2以下。它可能会像0.1/2或0.1/3这样工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接