我正在 iOS 中创建今天的扩展。 我想要做的是在今天的扩展中添加 UISlider 的动画值变化。 动画应该从开始值到结束值进行。
我尝试了两种方式: 第一个 UIView 动画
func updateSliderView(beginState:Float, duration: NSTimeInterval) {
sliderView.hidden = false
sliderView.setValue(beginState, animated: false)
UIView.animateWithDuration(duration) { () -> Void in
self.sliderView.setValue(1, animated: true)
}
}
其次是基本动画。
func updateSliderView(beginState:Float, duration: NSTimeInterval) {
sliderView.hidden = false
guard let _ = sliderView.layer.animationForKey("slider.animation.value") else {
let animation = CABasicAnimation(keyPath: "value")
animation.fromValue = beginState
animation.toValue = 1
animation.removedOnCompletion = true
sliderView.layer.addAnimation(animation, forKey: "slider.animation.value")
return
}
}
我正在使用新的 XCode 7.0.1 和 iOS 目标 8.1 两个结果都没有动画。 UISlider 禁用了用户交互。 我正在使用 UISluder,因为我有用于 slider 路径最小和最大轨道以及 slider 拇指的自定义图形。
我做了第三次测试
sliderView.setValue(beginState, animated: false)
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
sliderView.setValue(1, animated: true)
CATransaction.commit()
它不会工作:/
总结:只有 UIView.animation 有效。它是动画但它打破了我的 UISlider 自定义图形并且它没有设置 slider 的起始值。
如何为 Todays 扩展中的 UISlider 值变化设置动画?
最佳答案
好的,我解决了。 我回答我自己的问题,因为它可能会对某些人有所帮助,而这正是我所要求的解决方案。
Todays Extension 中只有 UIView.animation 为 UISlider 设置动画。但是设置起始值在动画之前不起作用,并且动画破坏了 slider 上的自定义图形。 当您在 UIView.animation block 中设置起始值时,我发现它会按我想要的方式工作。
UIView.animateWithDuration(0.2, delay: 0, options: .CurveLinear, animations: { () -> Void in
self.sliderView.setValue(beginState, animated: true)
}) { (completed) -> Void in
UIView.animateWithDuration(duration, delay: 0.1, options: .CurveLinear, animations: { () -> Void in
self.sliderView.setValue(1, animated: true)
}, completion: nil)
}
我组合了两个 UIView 动画 block 。结果和我之前预想的一样。 起始值已设置。 UISlider 值从起始值动画到结束。所有自定义图形(如最小值、最大值和拇指)均已正确呈现。
关于iOS Todays 小部件扩展 - 动画 UISlider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32860643/