Подтвердить что ты не робот

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

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

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

 layer.position = CGPointMake(x, y)

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

4b9b3361

Ответ 1

Вы хотите связать свой вызов следующим образом:

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

Ответ 2

Быстрое расширение 3:

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

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

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

Ответ 3

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

[CATransaction setDisableActions:YES] 

.

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

Ответ 4

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

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

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

Ответ 5

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