Obracam CALayer i próbuję zatrzymać go w ostatecznej pozycji po zakończeniu animacji.
Ale po zakończeniu animacji wraca do swojej początkowej pozycji.
(Dokumenty xcode wyraźnie mówią, że animacja nie zaktualizuje wartości właściwości).
wszelkie sugestie, jak to osiągnąć.
ios
iphone
calayer
cabasicanimation
Nilesh Ukey
źródło
źródło
.presentation()
aby uzyskać „ostateczną, widzianą” wartość. Wyszukaj poniżej poprawne odpowiedzi, które wyjaśniają, że zostało to zrobione z warstwą prezentacji.Odpowiedzi:
Oto odpowiedź, to połączenie mojej odpowiedzi i odpowiedzi Krishnana.
Wartość domyślna to
kCAFillModeRemoved
. (Jakie jest zachowanie resetowania, które widzisz).źródło
Problem z removeOnCompletion polega na tym, że element UI nie pozwala na interakcję z użytkownikiem.
I technika polega na ustawieniu wartości FROM w animacji i wartości TO na obiekcie. Animacja automatycznie wypełni wartość TO przed rozpoczęciem, a po usunięciu pozostawi obiekt we właściwym stanie.
źródło
alphaAnimation.beginTime = 1;
Poza tym, ofillMode
ile wiem, nie jest potrzebne ...?beginTime
nie jest to względne, powinieneś użyć np .:CACurrentMediaTime()+1;
fillMode
, zobacz więcej w artykule Zapobieganie powracaniu warstw do oryginalnych wartości podczas używania jawnychUstaw następującą właściwość:
źródło
po prostu umieść go w swoim kodzie
źródło
Możesz po prostu ustawić klucz od
CABasicAnimation
doposition
podczas dodawania go do warstwy. W ten sposób nadpisuje niejawną animację wykonaną na pozycji dla bieżącego przebiegu w pętli uruchamiania.Możesz uzyskać więcej informacji na temat 2011 Apple WWDC Video Session 421 - Core Animation Essentials (środek wideo)
źródło
someLayer.position = endPosition;
. I dzięki za referencje do WWDC!CALayer ma warstwę modelu i warstwę prezentacji. Podczas animacji warstwa prezentacji jest aktualizowana niezależnie od modelu. Po zakończeniu animacji warstwa prezentacji jest aktualizowana o wartość z modelu. Jeśli chcesz uniknąć gwałtownego skoku po zakończeniu animacji, kluczem jest zsynchronizowanie obu warstw.
Jeśli znasz wartość końcową, możesz po prostu ustawić model bezpośrednio.
Ale jeśli masz animację, w której nie znasz pozycji końcowej (np. Powolne zanikanie, które użytkownik może zatrzymać, a następnie cofnąć), możesz bezpośrednio zapytać warstwę prezentacji, aby znaleźć bieżącą wartość, a następnie zaktualizować model.
Pobieranie wartości z warstwy prezentacji jest również szczególnie przydatne przy skalowaniu lub obracaniu ścieżek klawiszy. (na przykład
transform.scale
,transform.rotation
)źródło
Bez używania
removedOnCompletion
Możesz wypróbować tę technikę:
źródło
Mój problem polegał na tym, że próbowałem obrócić obiekt za pomocą gestu przesuwania, więc miałem wiele identycznych animacji w każdym ruchu. Miałem jedno
fillMode = kCAFillModeForwards
i drugie,isRemovedOnCompletion = false
ale to nie pomogło. W moim przypadku musiałem upewnić się, że klucz animacji jest inny za każdym razem, gdy dodaję nową animację :źródło
Po prostu ustawienie
fillMode
iremovedOnCompletion
nie działało dla mnie. Rozwiązałem problem, ustawiając wszystkie poniższe właściwości na obiekt CABasicAnimation:Ten kod przekształca się
myView
do 85% swojego rozmiaru (trzeci wymiar niezmieniony).źródło
Podstawowa animacja zachowuje dwie hierarchie warstw: warstwę modelu i warstwę prezentacji . Gdy animacja jest w toku, warstwa modelu jest faktycznie nienaruszona i zachowuje wartość początkową. Domyślnie animacja jest usuwana po zakończeniu. Następnie warstwa prezentacji wraca do wartości warstwy modelu.
Po prostu ustawienie
removedOnCompletion
naNO
drodze animacja nie zostaną usunięte i pamięci odpadów. Ponadto warstwa modelu i warstwa prezentacji nie będą już synchroniczne, co może prowadzić do potencjalnych błędów.Dlatego lepszym rozwiązaniem byłoby zaktualizowanie właściwości bezpośrednio na warstwie modelu do wartości końcowej.
Jeśli istnieje jakakolwiek niejawna animacja spowodowana przez pierwszą linię powyższego kodu, spróbuj ją wyłączyć:
źródło
To działa:
Główna animacja pokazuje podczas animacji „warstwę prezentacji” na wierzchu zwykłej warstwy. Ustaw więc krycie (lub cokolwiek) na to, co chcesz widzieć, gdy animacja się zakończy, a warstwa prezentacji zniknie. Zrób to w wierszu przed dodaniem animacji, aby uniknąć migotania po jej zakończeniu.
Jeśli chcesz mieć opóźnienie, wykonaj następujące czynności:
Wreszcie, jeśli użyjesz opcji „removeOnCompletion = false”, spowoduje to wyciek CAAnimations, aż warstwa zostanie ostatecznie usunięta - unikaj.
źródło
Odpowiedź @Leslie Godwin nie jest zbyt dobra, „self.view.layer.opacity = 1;” jest wykonywana natychmiast (zajmuje to około jednej sekundy), proszę poprawić alphaAnimation.duration do 10.0, jeśli masz wątpliwości. Musisz usunąć tę linię.
Tak więc, kiedy ustawisz fillMode na kCAFillModeForwards i usunieszOnCompletion na NO, pozwolisz animacji pozostać w warstwie. Jeśli naprawisz delegata animacji i spróbujesz czegoś takiego:
... warstwa jest przywracana natychmiast po wykonaniu tej linii. Tego chcieliśmy uniknąć.
Musisz naprawić właściwość warstwy przed usunięciem z niej animacji. Spróbuj tego:
źródło
Wygląda na to, że flaga removeOnCompletion ustawiona na false i fillMode ustawiona na kCAFillModeForwards również nie działa dla mnie.
Po zastosowaniu nowej animacji na warstwie, animowany obiekt wraca do swojego stanu początkowego, a następnie animuje z tego stanu. Co jeszcze należy zrobić, to ustawić żądaną właściwość warstwy modelu zgodnie z właściwością warstwy prezentacji przed ustawieniem nowej animacji w następujący sposób:
źródło
Najłatwiejszym rozwiązaniem jest użycie niejawnych animacji. To rozwiąże wszystkie te problemy za Ciebie:
Jeśli chcesz dostosować np. Czas trwania, możesz użyć
NSAnimationContext
:Uwaga: jest to testowane tylko w systemie macOS.
Początkowo nie widziałem żadnej animacji, kiedy to robiłem. Problem polega na tym, że warstwa warstwy zabezpieczonej widokiem nie jest niejawnie animowana. Aby rozwiązać ten problem, upewnij się, że samodzielnie dodałeś warstwę (przed ustawieniem widoku na oparty na warstwach).
Przykładem, jak to zrobić, byłoby:
Używanie
self.wantsLayer
nie miało żadnego wpływu na moje testy, ale może mieć pewne skutki uboczne, o których nie wiem.źródło
Oto próbka z placu zabaw:
false
sięisRemovedOnCompletion
- niech Core Animation czysty po zakończeniu animacjiźródło