it-swarm.com.ru

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

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

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

 layer.position = CGPointMake(x, y)

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

73
Mel

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

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

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

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

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

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

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

[CATransaction setDisableActions:YES] 

также.

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

20
Biclops

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

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

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

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