Como você mover um CALayer instantaneamente (sem animação)
-
03-07-2019 - |
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.
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
}