Swift : CALayer动画后的宽度

Swift : Width of CALayer after animation

您在下面看到的代码创建了一个 CALayer(矩形)并在用户按住屏幕(longPressGestureRecognizer)时从左到右对其进行动画处理。当他们抬起手指时,CALayer 停止动画。您可以在新项目中直接复制粘贴代码:

//Global Variables
var layer: CALayer?
var holdGesture = UILongPressGestureRecognizer()
let animation = CABasicAnimation(keyPath: "bounds.size.width")

func setUpView() {

    self.view.addGestureRecognizer(holdGesture)
    holdGesture.addTarget(self, action:"handleLongPress:")
}

func handleLongPress(sender : UILongPressGestureRecognizer) {

    if(sender.state == .Began) {

        let newLayer = CALayer()
        newLayer.frame = CGRect(x: 0, y: 0, width: 0, height: 10)
        newLayer.backgroundColor = UIColor.redColor().CGColor

        animation.fromValue = 0
        animation.toValue = self.view.bounds.width * 2
        animation.duration = 5
        self.view.layer.addSublayer(newLayer)

        print("Long Press Began")
        newLayer.addAnimation(animation, forKey: "bounds.size.width")

        layer = newLayer
    }
    else {
        print("Long press ended")

        if let layer = layer {
            pauseLayer(layer)
        }
    }
}

func pauseLayer(layer : CALayer){
    let pausedTime : CFTimeInterval = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
    layer.speed = 0.0

    layer.timeOffset = pausedTime
}

当 "Long press ended" 发生时(用户松开手指)图层有一个新的宽度。但是,当我打印它时,它说它是“0.0”。我不知道为什么。如何获取动画后图层的宽度?

tl;dr: 您可以通过层的 presentationLayer() 获取动画期间出现的值。


您遇到了层的模型值与其表示值之间的差异。当您向图层添加动画时,它只会更改图层在屏幕上的显示方式(演示值),但不会更改实际的 属性 动画(模型值)。

当简单地从一个值到另一个值设置动画时,通常会将动画 属性 设置为其最终值,以便动画完成后模型和演示文稿将相同。

但是,由于看起来您在动画完成之前暂停了动画,因此不会为您提供当前显示在屏幕上的值(演示值)。相反,您可以为它的表示层请求一个层,它保存(近似)当前值,因为它们出现在屏幕上。