Swift: ширина CALayer после анимации

Код, который вы видите ниже, создает 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». Я не знаю почему. Как я могу получить ширину слоя после анимации?


person OriginalAlchemist    schedule 12.01.2016    source источник


Ответы (1)


tl;dr: вы можете получить значения, как они появляются во время анимации через presentationLayer() слоя.


Вы столкнулись с разницей между значением модели слоя и значением его представления. Когда вы добавляете анимацию к слою, изменяется только то, как слой отображается на экране (значение представления), но не фактическое анимируемое свойство (значение модели).

При простом переходе от одного значения к другому обычно устанавливают для анимированного свойства его конечное значение, чтобы модель и представление были одинаковыми после завершения анимации.

Однако, поскольку похоже, что вы приостанавливаете анимацию до ее завершения, это не даст вам значения, которое в настоящее время отображается на экране (значение презентации). Вместо этого вы можете запросить у слоя уровень представления, который содержит (близкое приближение) текущие значения по мере их появления на экране.

person David Rönnqvist    schedule 12.01.2016
comment
Ты великолепен. Большое спасибо. Это сильно помогает. - person OriginalAlchemist; 12.01.2016