Вопрос

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

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

 layer.position = CGPointMake(x, y)

Как я могу двигаться CALayers мгновенно?Кажется, я никак не могу разобраться в основном API анимации.

Это было полезно?

Решение

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

[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
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top