Próbuję przeciągnąć CALayer
w aplikacji na iOS.
Jak tylko zmienię właściwość position, próbuje animować do nowej pozycji i miga w każdym miejscu:
layer.position = CGPointMake(x, y)
Jak mogę CALayers
natychmiast się przenieść ? Nie mogę się rozejrzeć po interfejsie API Core Animation.
Odpowiedzi:
Chcesz zakończyć rozmowę w następujący sposób:
[CATransaction begin]; [CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions]; layer.position = CGPointMake(x, y); [CATransaction commit];
źródło
[UIView performWithoutAnimation:<#^(void)actionsWithoutAnimation#>];
Rozszerzenie Swift 3:
extension CALayer { class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void){ CATransaction.begin() CATransaction.setValue(true, forKey: kCATransactionDisableActions) actionsWithoutAnimation() CATransaction.commit() } }
Stosowanie :
CALayer.performWithoutAnimation(){ someLayer.position = newPosition }
źródło
@noescape
atrybutu do bloku, aby zezwolić (i wyjaśnić), żeself
nie jest potrzebny w blokuMożesz także skorzystać z funkcji komfortowej
[CATransaction setDisableActions:YES]
także.
Uwaga: koniecznie przeczytaj komentarze Yogeva Shelly, aby zrozumieć wszelkie pułapki, które mogą wystąpić.
źródło
Jak sugerowali inni, możesz użyć
CATransaction
.Problem pojawia się, ponieważ CALayer ma domyślny niejawny czas trwania animacji wynoszący 0,25 sekundy.
W związku z tym łatwiejszą (moim zdaniem) alternatywą
setDisableActions
jest użyciesetAnimationDuration
z wartością0.0
.[CATransaction begin]; [CATransaction setAnimationDuration:0.0]; layer.position = CGPointMake(x, y); [CATransaction commit];
źródło
Łącząc poprzednie odpowiedzi tutaj dla Swift 4, aby wyraźnie określić czas trwania animacji ...
extension CALayer { class func perform(withDuration duration: Double, actions: () -> Void) { CATransaction.begin() CATransaction.setAnimationDuration(duration) actions() CATransaction.commit() } }
Stosowanie...
CALayer.perform(withDuration: 0.0) { aLayer.frame = aFrame }
źródło