我正在学习如何将CoreAnimation与各种UI元素一起使用.最后,当我转换到下一个视图时,我想在屏幕上的所有ui元素上执行复杂的排队动画.
然而,现在我尝试的东西非常简单.我想在按钮点击上转换(放大)UILabel.
我有以下功能:
func animateUIElementsOut(element : AnyObject) {
var animation : CABasicAnimation = CABasicAnimation(keyPath: "transform");
var transform : CATransform3D = CATransform3DMakeScale(2, 2, 1);
animation.setValue(NSValue(CATransform3D: transform), forKey: "scaleText");
animation.duration = 2.0;
element.layer?.addAnimation(animation, forKey: "scaleText");
}
我在按钮上调用该函数,如下所示:
animateUIElementsOut(greetingsLabel);
编译器没有发出任何警告,但动画不起作用.我在这做错了什么?
根据@DavidRönnqvist的建议,工作代码看起来像这样(fromValue / toValue添加):
func animateUIElementsOut(element : AnyObject) {
var animation : CABasicAnimation = CABasicAnimation(keyPath: "transform");
animation.delegate = self;
var transform : CATransform3D = CATransform3DMakeScale(2, 2, 1);
animation.fromValue = NSValue(CATransform3D: CATransform3DIdentity);
animation.toValue = NSValue(CATransform3D: transform);
animation.duration = 2.0;
element.layer?.addAnimation(animation, forKey: nil);
}
最佳答案 动画既没有toValue也没有fromValue.
您正在为动画上的“scaleText”键设置变换,但动画没有相应的属性.
要使动画本身工作,您应将变换设置为动画的toValue.然而,仍有一些东西缺失使整个事情发挥作用.图层的模型值永远不会更改,因此当动画完成并被删除时,您将再次看到旧的(模型)值.
如果您只对制作缩放动画感兴趣,我建议您使用更高级别的UIView动画API:
UIView.animateWithDuration(2.0) {
element.transform = CGAffineTransformMakeScale(2, 2)
}
另一方面,如果您有兴趣使用Core Animation,还有很多事情要做,以使其全部工作.
>将动画配置为从当前模型值开始(使用fromValue属性)
>配置动画以转到新值(如上所述)
>在添加动画之前,将模型值更新为新值.
作为一个侧面的琐事,你可以设置“scaleText”的值而没有任何这样的属性的原因是图层和动画的工作方式与大多数具有键值编码的类有点不同.您可以使用键值编码在图层和视图上设置和获取任何值.这意味着这是有效的代码:
let layer = CALayer()
layer.setValue(1, forKey: "foo")
var foo = layer.valueForKey("foo") // is equal to 1
let anim = CABasicAnimation(keyPath: "bounds")
anim.setValue(2, forKey: "bar")
var bar = anim.valueForKey("bar") // is equal to 2
但是,如果您尝试在几乎任何其他对象上执行相同操作,则会收到运行时异常,指出该类不符合该键的键值编码.例如,这段代码:
let view = UIView(frame: CGRectZero)
view.setValue(3, forKey: "baz")
产生此运行时异常:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIView 0x10dc08b30> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key baz.'