【问题标题】:Swift : Width of CALayer after animationSwift:动画后CALayer的宽度
【发布时间】:2016-01-12 07:44:02
【问题描述】:

您在下面看到的代码创建了一个 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”。我不知道为什么。动画后如何获取图层的宽度?

【问题讨论】:

    标签: ios swift calayer caanimation


    【解决方案1】:

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


    您已经遇到过层的模型值和表示值之间的差异。当您将动画添加到图层时,它只会更改图层在屏幕上的显示方式(表示值),但不会更改被动画的实际属性(模型值)。

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

    但是,由于您似乎在动画完成之前暂停了动画,因此不会为您提供当前在屏幕上显示的值(演示值)。相反,您可以向一个层询问它的表示层,该表示层在屏幕上显示当前值时保持(非常接近)当前值。

    【讨论】:

    • 你太棒了。太感谢了。这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多