Pergunta

Eu estou tentando arrastar um CALayer em um aplicativo iOS.

Assim que eu altere sua propriedade posição que tenta animar para a nova posição e treme todo o lugar:

 layer.position = CGPointMake(x, y)

Como posso mover CALayers instantaneamente? Eu não consigo obter minha cabeça em torno da API Core Animation.

Foi útil?

Solução

Você quer quebrar a sua chamada no seguinte:

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

Outras dicas

Swift 3 Extensão:

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

Uso:

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

Você também pode usar a função de conveniência

[CATransaction setDisableActions:YES] 

também.

Nota:. Certifique-se de ler os comentários por Yogev Shelly entender alguma dicas que poderia ocorrer

Como já foi sugerido, você pode usar CATransaction.
O problema vem surge porque CALayer tem uma duração de animação implícita padrão de 0,25 segundos.

Assim, um mais fácil (na minha opinião) alternativa para setDisableActions é usar setAnimationDuration com um valor de 0.0.

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

A combinação de respostas anteriores aqui para Swift 4, para fazer claramente a duração de animação explícita ...

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

Uso ...

CALayer.perform(withDuration: 0.0) {
            aLayer.frame = aFrame
        }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top