首页 文章

Swift:动画后CALayer的宽度

提问于
浏览
0

您在下面看到的代码会创建一个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
}

当“长按结束”(用户抬起手指)时,图层有一个新的宽度 . 但是,当我打印它时,它表示“0.0” . 我不知道为什么 . 如何在动画后获得图层的宽度?

1 回答

  • 2

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


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

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

    但是,由于看起来您在动画完成之前暂停动画,因此不会为您提供当前屏幕上显示的值(演示文稿值) . 相反,您可以向图层询问它的表示层,该图层保持(非常接近)屏幕上显示的当前值 .

相关问题