Как вы перемещаете CALayer мгновенно (без анимации)

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

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

layer.position = CGPointMake(x, y)

Как я могу перемещать CALayers мгновенно? Я не могу разобраться с Core Animation API.

5 ответов

Решение

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

[CATransaction begin]; 
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];

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

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

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

CALayer.performWithoutAnimation(){
    someLayer.position = newPosition
}

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

[CATransaction setDisableActions:YES] 

также.

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

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

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

[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];

Комбинируя предыдущие ответы здесь для 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
        }
Другие вопросы по тегам