CABasicAnimation与键路径“边界”不起作用

时间:2014-12-20 02:21:12

标签: swift bounds cabasicanimation

我使用CABasicAnimation将以下代码添加到CALayer的动画边界属性中。但代码似乎没有用。

    let fromValue = textLabel.layer.bounds
    let toValue = CGRectMake(textLabel.layer.bounds.origin.x, textLabel.layer.bounds.origin.y,   textLabel.layer.bounds.width, textLabel.layer.bounds.height + 50)

    let positionAnimation = CABasicAnimation(keyPath: "bounds")
    positionAnimation.fromValue = NSValue(CGRect: fromValue)
    positionAnimation.toValue = NSValue(CGRect: toValue)
    positionAnimation.duration = 1
    positionAnimation.fillMode = kCAFillModeBoth
    positionAnimation.removedOnCompletion = false

    textLabel.layer.addAnimation(positionAnimation, forKey: "bounds")

1 个答案:

答案 0 :(得分:8)

您的代码确实有效。如果运行代码然后在Xcode中打开View Debugging,您将看到标签的高度增加了。 “问题”是iOS 8中的UILabel即使在以这种方式人为增加其图层高度之后,也以相同的方式绘制自己(其文本及其背景,如果有的话)。 (我相信这是因为标签使用基于文本内容的特殊剪辑区域来绘制自己。)

为了向自己证明这一点,请在普通的UIView(带有彩色背景)而不是标签上进行尝试。我冒昧地清理你的代码(你不应该误用fillModeremovedOnCompletion你的方式 - 它只是表明对动画的缺乏了解:

    let fromValue = view2.layer.bounds.height
    let toValue = view2.layer.bounds.height + 50
    CATransaction.setDisableActions(true)
    view2.layer.bounds.size.height = toValue
    let positionAnimation = CABasicAnimation(keyPath: "bounds.size.height")
    positionAnimation.fromValue = fromValue
    positionAnimation.toValue = toValue
    positionAnimation.duration = 1
    view2.layer.addAnimation(positionAnimation, forKey: "bounds")

你会发现它完美无缺。现在将view2改为textLabel。它仍然有效,只是没有什么可看的。

另一种向自己证明这一点的方法是删除整个动画,只需更改标签的图层高度:

    self.textLabel.layer.bounds.size.height += 50

你不会看到任何事情发生。所以动画中没有错误;这完全取决于标签的绘制方式。

您可以通过更改视图而不是图层来显示更改:

    self.textLabel.bounds.size.height += 50

另外一个“问题”是动画不是动画。这也是因为标签是以特殊方式绘制的。

无论你想要实现它,你都必须以不同的方式去实现它。您可能在彩色视图前面有一个清晰的标签,并为视图的高度变化设置动画;我们已经证明这是有效的。