2008-10-22 10 views
58

Próbuję przeciągnąć CALayer w aplikacji na iOS.Jak przenieść CALayer natychmiast (bez animacji)?

Jak tylko zmienić jego właściwości position stara się animować do nowej pozycji i migocze w każdym miejscu:

layer.position = CGPointMake(x, y) 

Jak mogę przenieść CALayers natychmiast? Nie jestem w stanie poradzić sobie z interfejsem API Core Animation.

Odpowiedz

131

Chcesz zawinąć rozmowy w następujących przypadkach:

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

To jest dokładnie to. Nawet nie myślałem o CATransaction. Wielkie dzięki! – Mel

+3

2 lata później ,, dzięki, lol. – nacho4d

+3

5 lat później, dzięki! – MichaelScaria

17

Można również użyć funkcji ogólnospożywczy

[CATransaction setDisableActions:YES] 

również.

Uwaga: pamiętaj, aby przeczytać komentarze autorstwa Jogev Shelly, aby zrozumieć wszelkie błędy, które mogą wystąpić.

+4

Ważne, działa to na wszystkie CALayer, więc chcesz ponownie włączyć działania po zakończeniu, np. [CATransaction setDisableActions: YES] –

+0

Cholera, powinienem był to powiedzieć. Dobra obrona. Polecenie wyłącza animacje, dopóki nie zostanie ustawione na NIE lub dopóki główny silnik animacji graficznej nie zakończy cyklu uruchamiania. Nie jestem pewien, czy to właściwe słowo:/Ale dziękuję za wyjaśnienie tego wszystkim. – Biclops

12

Jak sugerowali inni, możesz użyć CATransaction.
Problem pojawia się, ponieważ CALayer ma domyślny domyślny czas trwania animacji 0,25 sekundy.

W ten sposób łatwiej (moim zdaniem) alternatywą dla setDisableActions jest użycie setAnimationDuration o wartości 0.0.

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

Łatwy do zapamiętania, łatwy do zrozumienia, gdy ponownie czytasz kod i łatwiejsze do wpisania. Dzięki! –

10

Swift 3 Rozszerzenie:

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

Zastosowanie:

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

Warto dodać atrybut '@ noescape' do bloku, aby zezwolić (i wyjaśnić), że' self' nie jest potrzebny w bloku – Andrew

Powiązane problemy