2011-08-08 6 views
14

Korzystając z animacji rdzenia, chciałbym spasować obiekt UIView (to jest) w środku. tj. ustawiam punkt kontrolny jako (0,5,0.5) & zwiń warstwę. Ten obraz, który stworzyłem w programie Photoshop może dać efekt szukam -Animacja rdzenia iOS - składanie warstwy

enter image description here

tak, to co się dzieje jest warstwa jest składana na jego środku, jak fałda dzieje się trochę perspektywy jest stosowany (niesławny m34!). Początkowo widok jest równoległy w płaszczyźnie X-Y z osią Z patrząc prosto do użytkownika. Podczas składania, dolna połowa & górna połowa w tym samym czasie cofa się (z pewną perspektywą, aby nadać głębię & efekt 3D), aż cała warstwa będzie (równoległa) w płaszczyźnie X-Z. Zwróć uwagę, że gdy warstwa jest równoległa w płaszczyźnie X-Z, użytkownik nie będzie mógł zobaczyć warstwy. Ale to jest w porządku, to efekt, którego szukam. A UIView znikając po złożeniu na środku.

Jak można to zrobić w iOS? Bez użycia 2 różnych warstw (dla dna & dla góry)? Każda pomoc jest mile widziane ...

Aktualizacja: W @miamk zwraca uwagę, jest to ten sam efekt UI stosowane w „nasz wybór” aplikacji lub „Flipboard” App. Przez ostatnie 8 godzin budzę moje rozumowanie, na razie bezowocne. KAŻDY pomysł jest doceniany. Dzięki ...

UPDATE: Oferuję nagrodę za to, aby uzyskać bardziej szczegółowe odpowiedzi. Chciałbym zobaczyć -

  1. Próbki kodu.
  2. Poradź od ludzi, którzy zrobili coś takiego.
  3. Nawet droga do osiągnięcia tego w sposób szczegółowy (algo) jest bardzo doceniana.
+0

To byłoby coś podobnego do aplikacji Alge Gore'a (fałdowanie i otwieranie obrazów) lub strony Flipboard zmieniającej animację, prawda? Dobre pytanie, chociaż wątpię, czy mogę ci pomóc. – MiguelB

+0

Tak, coś w tym stylu! Sprawdź, czy możesz wymyślić JAKIKOLWIEK pomysł? nieważne, jak szalone jest to ... –

Odpowiedz

20

A CALayer to samolot, którego nie można złożyć. O ile nie napiszesz do niego filtra rdzenia, takiego jak efekt zwijania strony, ale jeśli jest to prywatny interfejs API, a nie opcja.

Musisz podzielić swój widok na dwa widoki i sfałszować zakładkę, przekształcając dwa jednocześnie: CALayer.

domyślnie warstwy przekształcenia nie mają perspektywy, więc musisz także ustawić to:

transform.m34 = 1.0/-2000; 

OK Bądźmy jeszcze wyraźniej: Split widok na dwie części i złóż je:

Twój widok hiarchii według zamieszczonego obrazu wygląda mniej więcej tak:

+ UIView  - Root view 
    + UIImageView - The persons face 
    + UILabel  - The label with title 
    + UILabel  - The label with company name 
    + UILabel  - The label with a short description. 
    + UILabel  - The label with e-mail 
    + UILabel  - The label with web address 
    + UILabel  - The label with phone number 

Przedstaw te dwa widoki rarchy w celu złożenia, tak:

+ UIView - Root view 
    + UIView  - Top half of the card 
     + UIImageView - The persons face 
     + UILabel  - The label with title 
     + UILabel  - The label with company name 
     + UILabel  - The label with a short description. 
    + UIView  - Bottom half of the view 
     + UILabel  - The label with e-mail 
     + UILabel  - The label with web address 
     + UILabel  - The label with phone number 

Nie za ciężko. Teraz animuj tylko dwa widoki używane do grupowania górnej i dolnej połowy.

Nie napiszę kodu dla ciebie, ale ważniejsza wskazówka, aby to ułatwić: Zmień punkty kontrolne widoku, aby animować! Nie chcesz obracać ich przez własne centra, zamiast tego przesuwaj środek obrotu, aby wyrównać względem krawędzi, które mają względem siebie.

topView.layer.anchorPoint = CGPointMake(0.5f, 1.0f); 
bottomView.layer.anchorPoint = CGPointMake(0.5f, 0.0f); 
+0

Mam pomysł podzielenia mojego widoku na 2 warstwy i uruchomienia animacji na tym. Ale co dzieje się z oryginalną warstwą? Jak podzielić mój "CALayer" na 2 warstwy? Po zakończeniu animacji, jak przywrócić? Jaki kod napisałeś, to dać perspektywę, ja to wiem. Prawdziwą częścią, której potrzebowałem, było podzielenie mojej warstwy na 2 części ... –

+0

@Srikar - Nie rozdzielałbym i nie łączyć warstw przez cały czas. Po prostu pójdę na dwa "UIView", które akurat są obok siebie. Mniej fuzz. – PeyloW

+0

Najpierw dziękuję za poświęcenie czasu na omówienie tego. Teraz wracam, co mówisz może być brzydkie, ponieważ chcę to zrobić na "UITableViewCell". Chcę, aby mój tableViewCell spasował i zniknął. Przy twoim podejściu musiałbym podać mnóstwo kodu, aby podzielić moją treść na 2 komórki. Musi być lepszy sposób? –

5

Zrobiłem małe badania i natknąłem się na ten niesamowity projekt na Github: AFKPageFlipper. Jest całkiem ładny, wiedziałeś o tym? Jest to w zasadzie animacja Flipboard wykonana w całości za pomocą prostej i prostej animacji Core.

Spójrz na to, zadziwiająco łatwo postępuj zgodnie z kodem, a może to dać ci wskazówki, jak wdrożyć to, czego potrzebujesz.

+0

Czy możesz podać link? –

+0

@ BarryWark zrobiłem. Został zredagowany z jakiegoś powodu, którego nie rozumiem. Nadal możesz zobaczyć link przed wersją. – MiguelB

+0

@Strikar Dlaczego usunąć link? – MiguelB

11

Co o tym rodzaju workflow:

Get image z widoku

UIGraphicsBeginImageContext(self.bounds.size); 
[self.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

następnie utworzyć 2 zdjęcia (górny i dolny rect) używając

CGImageCreateWithImageInRect(CGImageRef, CGRect); 

Pozostawia z zasobami, które musisz zrobić, co chcesz. Dynamicznie tworzone zdjęcia z góry i z dołu, które można animować.

+3

, więc czy ukrywam oryginalny widok? i umieść te 2 obrazy (u góry, u dołu) na ukrytym widoku, aby pojawił się jako jeden, a następnie wykonał animację złożenia? –