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 值从起始值动画到结束。所有自定义图形(如最小值、最大值和拇指)均已正确呈现。