Próbuję obrócić o UIImageView
360 stopni i obejrzałem kilka samouczków online. Nie mogłem sprawić, by żaden z nich pracował, bez UIView
zatrzymywania się i przeskakiwania do nowej pozycji.
- Jak mogę to osiągnąć?
Najnowsza rzecz, której próbowałem, to:
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
Ale jeśli użyję 2 * pi, to w ogóle się nie porusza (ponieważ jest w tej samej pozycji). Jeśli spróbuję zrobić tylko pi (180 stopni), to działa, ale jeśli ponownie wywołam metodę, obraca się do tyłu.
EDYCJA :
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
[UIView setAnimationRepeatCount:HUGE_VALF];
[UIView setAnimationBeginsFromCurrentState:YES];
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
też nie działa. Zmienia się w 180
stopnie, zatrzymuje na ułamek sekundy, a następnie resetuje z powrotem do 0
stopni, zanim zacznie się od nowa.
Wyrazy uznania dla Richarda J. Rossa III za pomysł, ale odkryłem, że jego kod nie był dokładnie tym, czego potrzebowałem.
options
Wierzę, że domyślnie daje ci toUIViewAnimationOptionCurveEaseInOut
, co nie wygląda dobrze w ciągłej animacji. Dodałem też czek, aby w razie potrzeby zatrzymać animację nawet o ćwierć obrotu (nie nieskończony , ale o nieokreślonym czasie trwania), a przyspieszenie przyspieszyło podczas pierwszych 90 stopni i zwalniało podczas ostatnich 90 stopni (po zażądaniu zatrzymania):Aktualizacja
Dodałem możliwość obsługi próśb o ponowne rozpoczęcie wirowania (
startSpin
), podczas gdy poprzedni spin się kończy (kończy). Przykładowy projekt tutaj na Github .źródło
M_PI / 2
z- (M_PI / 2)
. (Przewiń kod w prawo, aby zobaczyć koniec każdej linii)0.5
sekundy na 90 stopni, co ja? Jeśli tak, mój kod nie pozwala zatrzymać się o ułamek obrotu o 90 stopni. Pozwala zatrzymać się w pełnej liczbie 90-stopniowych odstępów, ale dodaje jeden dodatkowy obrót o 90 stopni, „łagodniejszy”. Tak więc, w powyższym kodzie, jeśli zadzwoniszstopSpin
po 0,35 sekundy, będzie wirować przez kolejne 0,65 sekundy i zatrzyma się przy całkowitym obrocie o 180 stopni. Jeśli masz bardziej szczegółowe pytania, prawdopodobnie powinieneś otworzyć nowe pytanie. Link do tej odpowiedzi jest bezpłatny.W Swift możesz użyć następującego kodu do nieskończonej rotacji:
Szybki 4
Szybki 3
Zatrzymywanie jest jak:
źródło
Powyższa odpowiedź Nate'a jest idealna do zatrzymania i uruchomienia animacji i daje lepszą kontrolę. Byłem zaintrygowany, dlaczego twój nie działa, a jego działa. Chciałem podzielić się tutaj swoimi odkryciami i prostszą wersją kodu, który animowałby UIView w sposób ciągły bez przeciągania.
To jest kod, którego użyłem,
Użyłem „CGAffineTransformRotate” zamiast „CGAffineTransformMakeRotation”, ponieważ ten pierwszy zwraca wynik, który jest zapisywany w trakcie animacji. Zapobiegnie to przeskakiwaniu lub resetowaniu widoku podczas animacji.
Inną rzeczą jest nieużywanie „UIViewAnimationOptionRepeat”, ponieważ pod koniec animacji, zanim zacznie się powtarzać, resetuje transformację, powodując, że widok przeskakuje z powrotem do pierwotnej pozycji. Zamiast powtarzania powtarzasz się, aby transformacja nigdy nie była resetowana do pierwotnej wartości, ponieważ blok animacji praktycznie nigdy się nie kończy.
Ostatnią rzeczą jest przekształcenie widoku w krokach co 90 stopni (M_PI / 2) zamiast 360 lub 180 stopni (2 * M_PI lub M_PI). Ponieważ transformacja zachodzi jako mnożenie macierzy wartości sinus i cosinus.
Powiedzmy, że jeśli użyjesz transformacji 180 stopni, cosinus 180 daje -1, co powoduje, że widok przekształca się za każdym razem w przeciwnym kierunku (odpowiedź Note-Nate'a również będzie miała ten problem, jeśli zmienisz wartość radianową transformacji na M_PI). Transformacja 360 stopni po prostu prosi widok, aby pozostał tam, gdzie był, dlatego nie widać żadnego obrotu.
źródło
rotateImageView
już się zakończył. W tym sensie nie jest to tak naprawdę rekurencyjne.Jeśli wszystko, co chcesz zrobić, to obracać obraz bez końca, działa to całkiem dobrze i jest bardzo proste:
Z mojego doświadczenia wynika, że działa to bezbłędnie, ale upewnij się, że twój obraz może być obracany wokół jego środka bez żadnych przesunięć, w przeciwnym razie animacja obrazu „przeskoczy”, gdy zbliży się do PI.
Aby zmienić kierunek obrotu, zmień znak
angle
(angle *= -1
).Aktualizuj komentarze @AlexPretzlav zmusił mnie do ponownej wizyty i zdałem sobie sprawę, że kiedy to napisałem, obraz, który obracałem, był odbijany zarówno wzdłuż osi pionowej, jak i poziomej, co oznacza, że obraz rzeczywiście obracał się tylko o 90 stopni, a następnie resetował, chociaż wyglądał jak cały czas się obracał.
Tak więc, jeśli twój obraz jest podobny do mojego, zadziała to świetnie, jednak jeśli obraz nie jest symetryczny, zauważysz „przyciąganie” z powrotem do pierwotnej orientacji po 90 stopniach.
Aby obrócić obraz niesymetryczny, lepiej jest zaakceptować odpowiedź.
Jedno z tych mniej eleganckich rozwiązań, pokazane poniżej, naprawdę obróci obraz, ale po ponownym uruchomieniu animacji może wystąpić zauważalne zacinanie:
Możesz to zrobić tylko z blokami, jak sugeruje @ richard-j-ross-iii, ale otrzymasz ostrzeżenie o pętli zatrzymania, ponieważ blok przechwytuje się:
źródło
UIViewAnimationOptionRepeat
ustawiłeś animacjęoptions
.Mój wkład w rozszerzenie Swift ze sprawdzonego rozwiązania:
Swift 4.0
Przestarzałe:
źródło
.infinity
.Niesamowita odpowiedź Davida Rysanka zaktualizowana do Swift 4 :
źródło
Użyj ćwierć obrotu i zwiększaj stopniowo.
źródło
To działało dla mnie:
źródło
W tym repozytorium znalazłem ładny kod ,
Oto kod z niego, zrobiłem małe zmiany zgodnie z moją potrzebą szybkości :)
UIImageView + Rotate.h
UIImageView + Rotate.m
źródło
Oto moje szybkie rozwiązanie jako rozszerzenie UIView. Można to uznać za symulację zachowania UIActivityIndicator na dowolnym UIImageView.
źródło
Wersja Swift3:
I pamiętaj, aby zadzwonić
startRotate
naviewWillAppear
nieviewDidLoad
.źródło
Możesz także wykonać ten sam typ animacji za pomocą UIView i bloków. Oto metoda rozszerzenia klasy, która może obracać widok o dowolny kąt.
źródło
Jeśli ktoś chciałby rozwiązania Natesa, ale szybko, oto szorstkie szybkie tłumaczenie:
źródło
dla Xamarin ios:
źródło
W ten sposób obracam 360 we właściwym kierunku.
źródło
Utwórz animację
Dodaj go do takiego widoku
Czym różni się ta odpowiedź? Będziesz miał znacznie czystszy kod, jeśli większość funkcji zwraca obiekty zamiast tylko manipulować niektórymi obiektami tu i tam.
źródło
Istnieją różne sposoby wykonywania animacji 360 stopni za pomocą UIView.
Korzystanie z CABasicAnimation
Oto funkcje rozszerzenia dla UIView, które obsługują operacje rozpoczynania i zatrzymywania obrotu:
Teraz używa zamknięcia UIView.animation :
źródło
@ barani odpowiedź była bardzo pomocna. Oto szybka wersja odpowiedzi.
Swift 2
Szybki 3,4,5
źródło
var stop = false
private func stopRotation() { stop = true }
Następnie w środkuif finished {...}
:if finished { if stop { return} self.rotateImageView() }
Opracowałem błyszczącą ramę animacji, która pozwala zaoszczędzić czas! Za pomocą tej animacji można bardzo łatwo stworzyć:
aby zatrzymać animację po prostu ustawić
nil
sięendlessRotater
.Jeśli jesteś zainteresowany, spójrz: https://github.com/hip4yes/Animatics
źródło
Swift 4 ,
Nr ref
źródło
Swift 4.0
źródło
Rozszerzenie UIView Swift 5 przy użyciu animacji klatek kluczowych
Takie podejście pozwala nam bezpośrednio korzystać z UIView.AnimationOptions.repeat
źródło
Szybki:
źródło
Swift 3:
źródło
źródło
Myślę, że powinieneś dodać
UIVIew
kategorię:Implementacja UIView (Obracanie)
Nie korzystam z tych metod :)
źródło