Как вы перемещаете CALayer мгновенно (без анимации) - PullRequest
72 голосов
/ 22 октября 2008

Я пытаюсь перетащить CALayer в приложение для iOS.

Как только я изменяю свое свойство позиции, оно пытается анимироваться на новую позицию и мерцает повсюду:

 layer.position = CGPointMake(x, y)

Как я могу двигаться CALayers мгновенно? Кажется, я не могу понять, что такое Core Animation API.

Ответы [ 5 ]

153 голосов
/ 22 октября 2008

Вы хотите заключить ваш звонок в следующее:

[CATransaction begin]; 
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
23 голосов
/ 27 ноября 2015

Расширение Swift 3:

extension CALayer {
    class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void){
        CATransaction.begin()
        CATransaction.setValue(true, forKey: kCATransactionDisableActions)
        actionsWithoutAnimation()
        CATransaction.commit()
    }
}

Использование:

CALayer.performWithoutAnimation(){
    someLayer.position = newPosition
}
18 голосов
/ 14 сентября 2011

Вы также можете использовать удобную функцию

[CATransaction setDisableActions:YES] 

также.

Примечание. Обязательно прочитайте комментарии Йогева Шелли, чтобы понять возможные ошибки.

14 голосов
/ 05 мая 2013

Как и предлагали другие, вы можете использовать CATransaction.
Проблема возникает, потому что CALayer имеет неявную длительность анимации по умолчанию, равную 0,25 секунды.

Таким образом, более простой (на мой взгляд) альтернативой setDisableActions является использование setAnimationDuration со значением 0.0.

[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];
2 голосов
/ 22 ноября 2018

Объединение предыдущих ответов здесь для Swift 4, чтобы четко определить продолжительность анимации ...

extension CALayer
{
    class func perform(withDuration duration: Double, actions: () -> Void) {
        CATransaction.begin()
        CATransaction.setAnimationDuration(duration)
        actions()
        CATransaction.commit()
    }
}

Использование ...

CALayer.perform(withDuration: 0.0) {
            aLayer.frame = aFrame
        }
...