2011-01-18 11 views
8

Czy istnieje sposób na zrobienie animacji drawRect Z POPRZEDNIEJ SCENY na następną?Chcę animować, w rzeczywistości znikną, "wewnątrz" drawRect

(Niesamowite) można animować wewnątrz drawRect - spróbuj. Możesz zanikać, przetłumaczyć lub animować dowolną inną nieruchomość.

Jednak zaczyna się "od świeżego", od pustego. Na przykład, jeśli wstawisz blok animacji w funkcji drawRect, poprzednia scena zniknie, a nowa scena zmieni kolor na biały.

chcę ekran zanikać od poprzedniego obrazu (sporządzony w poprzednim cyklu drawRect) do nowego obrazu Właśnie sporządzonej ... eee, m rysowanie.

Czy istnieje sposób, aby to zrobić, być może podstępnie, manipulując tym, co dzieje się z drawRect?

Byłoby to wydaje się być bardzo częsty przypadek użycie - mieszania z jednej sceny do następnej.

Czy ktoś zna sekret?

Oczywiście, można to oczywiście zrobić w głównym środowisku animacji lub na wiele innych sposobów, ale posiadanie drawRade z jednego drawRect to następnego jest oczywistym pomysłem. Twoje zdrowie.

zdumiewający aktualizacji dzięki geniuszowi WrightCS .....

tylko dzięki WrightCS, teraz wiemy, że drawRect obsługuje animacje idealnie. Wystarczy wkleić ten kod na końcu każdej drawRect i spróbuj go:

self.alpha = 0.0; 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:2]; 
self.alpha = 1.0; 
[UIView commitAnimations]; 

traktuje całą drawRect, bez względu na to, jak skomplikowane, jako jeden ogromny blok i owija go w tej animacji. Tak, zawiera nawet pomalowane obszary poza ekranem, rendering bitmapowy lub cokolwiek innego. Wszystko staje się animowane. Kto wiedział?

Problem pod ręką - jak sprawić, by animacja rozpoczynała się od poprzedniej sceny, zamiast zaczynać od pustej?

Odpowiedz

4

Trochę za późno, ale również tego szukałem, a zaakceptowana odpowiedź na this question działa jak urok od wewnątrz drawRect.

+1

dzięki! nigdy nie jest za późno na późne przyjścia :) – trillions

2

można animować alpha:

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:2.0]; 
myObject.alpha = 0.0; 
[UIView commitAnimations]; 
+0

@Joe Nigdy tego nie próbowałem, ale nie rozumiem, dlaczego nie. – WrightsCS

+5

Nie, NIE wolno ci tego robić z wnętrza drawRect :! Zrób to w innym miejscu i nie przejmuj się animowaniem wewnątrz twojego drawRect: –

4

drawRect jest niewidoczny. Zdarza się to w "Backbufferze", który iOS wyświetla na ekranie tylko wtedy, gdy jesteś gotowy z drawRect. Więc na pewno nie można animować podczas rysowania. Możesz jednak wykonywać instrukcje animacji niemal z dowolnego miejsca, w tym z drawresem. Ale animacja zostanie wykonana później.

Animacja wymaga czasu i pokazuje różne klatki użytkownikowi.

Możesz to wszystko zrobić samodzielnie (ciągle wymuszając przerysowanie i robiąc coś nieznacznie innego w trybie rysowania za każdym razem), ale to dużo pracy, szczególnie jeśli chcesz, żeby to było zrobione dobrze.

Na szczęście iOS ma wiele zaprogramowanych efektów animacji. Albo za pomocą Core Animation, albo (bardziej proste i podstawowe) animacje w UIKit. Ale ponieważ działa poprzez animowanie pewnych właściwości widoków (np. Alfa całego widoku lub obrotu całego widoku, ...), może być konieczne przestawienie swoich widoków i subskrybentów, aby dobrze z nich korzystać.

E.g. Każda kończyna konia jest oddzielnym wykiem, a Ty animujesz swoje transformacje (nie trzeba przerysowywać, iOS wykona resztę).

Np. Stara i nowa ramka są dwa oddzielne widoki i animowanie nową ramkę (który jest na górze) od 0 do alfa alfa 1.

+1

Nie mówię, że kod się nie powiedzie, ale nigdy nie będzie działać zanikając z poprzedniej klatki kluczowej do obecnej w ten sposób. –

+0

Praca z animacją jest z początku trochę skomplikowana, dopóki nie zdasz sobie sprawy, że wszystkie animowalne właściwości są przechowywane dwa razy: ten, do którego uzyskujesz dostęp w kodzie, jest "celem", podczas gdy coreanimacja oblicza "połowiczne" wartości, które faktycznie są wyświetlane na ekranie. CommitAnimations natychmiast zwraca kontrolę, rzeczywiste animacje będą później, bez konieczności opieki nad nim więcej. Można to nazwać odręcznie (dostosuję wodowanie mojej odpowiedzi). –

+0

Zobaczmy. Ale wątpię w to. –

1

jeśli jesteś pod iOS 5.0+, można użyć następujących:

... 
      [UIView animateWithDuration:0.3 
            delay:0.0 
           options:UIViewAnimationOptionBeginFromCurrentState 
          animations:^{ 
           //do your stuff here 
          }completion:^(BOOL finished) { 
           //completition stuff go here 
          }]; 
... 
0

Najlepszą rzeczą, jaką można zrobić, to użyć dwóch instancji UIView i animować między nimi.

Po uruchomieniu animacji musisz wiedzieć, jaki jest oryginalny i końcowy stan animacji. To trudne, jeśli jest to tylko jeden widok.