在Swift中使用CoreAnimation动画UILabel元素

时间:2014-06-22 17:24:44

标签: ios core-animation swift

我正在学习如何将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);
}

1 个答案:

答案 0 :(得分:2)

动画既没有toValue也没有fromValue

您正在为动画上的"scaleText"键设置变换,但动画没有相应的属性。

要使动画本身有效,您应该将变换设置为动画的toValue。然而,仍有一些东西缺失使整个事情发挥作用。图层的模型值永远不会更改,因此当动画完成并被删除时,您将再次看到旧的(模型)值。

如果您只想制作缩放动画,我建议您使用更高级别的UIView动画API:

UIView.animateWithDuration(2.0) {
    element.transform = CGAffineTransformMakeScale(2, 2)
}

另一方面,如果您有兴趣使用Core Animation,还有很多工作要做,以使其全部工作。

  1. 将动画配置为当前模型值(使用fromValue属性)
  2. 将动画配置为 新值(如上所述)
  3. 在添加动画之前将模型值更新为新值。

  4. 作为一个侧面琐事,你可以为“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.'