iOS 今天的小部件扩展 - 动画 UISlider
iOS Todays Widget Extension - Animate UISlider
我正在 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,因为我有用于滑块路径最小和最大轨道以及滑块拇指的自定义图形。
我做了第三次测试
sliderView.setValue(beginState, animated: false)
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
sliderView.setValue(1, animated: true)
CATransaction.commit()
它不会工作:/
总结:只有 UIView.animation 有效。它是动画但它打破了我的 UISlider 自定义图形并且它没有设置滑块的起始值。
如何在 Todays 扩展中为 UISlider 值的变化设置动画?
好的,我解决了。
我回答我自己的问题,因为它可能会对某些人有所帮助,而这正是我所要求的解决方案。
只有 UIView.animation 在 Todays Extension 中为 UISlider 设置动画。但是设置起始值在动画之前不起作用,并且动画破坏了滑块上的自定义图形。
我想通了,当你在 UIView.animation 块中设置起始值时,一切都会按我的意愿工作。
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动画。结果和我之前预想的一样。
起始值已设置。 UISlider 值从起始值动画到结束。所有自定义图形(如最小值、最大值和拇指)均已正确呈现。
我正在 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,因为我有用于滑块路径最小和最大轨道以及滑块拇指的自定义图形。
我做了第三次测试
sliderView.setValue(beginState, animated: false)
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
sliderView.setValue(1, animated: true)
CATransaction.commit()
它不会工作:/
总结:只有 UIView.animation 有效。它是动画但它打破了我的 UISlider 自定义图形并且它没有设置滑块的起始值。
如何在 Todays 扩展中为 UISlider 值的变化设置动画?
好的,我解决了。 我回答我自己的问题,因为它可能会对某些人有所帮助,而这正是我所要求的解决方案。
只有 UIView.animation 在 Todays Extension 中为 UISlider 设置动画。但是设置起始值在动画之前不起作用,并且动画破坏了滑块上的自定义图形。 我想通了,当你在 UIView.animation 块中设置起始值时,一切都会按我的意愿工作。
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动画。结果和我之前预想的一样。 起始值已设置。 UISlider 值从起始值动画到结束。所有自定义图形(如最小值、最大值和拇指)均已正确呈现。