2011-01-23 16 views
7

Próbuję animować wysokość obrazu (od wysokości 0 pikseli do 480 pikseli), aby uzyskać efekt odwzorowania obrazu z góry na dół.Animowanie obiektu UIImage lub UIImageView?

Przy UIImageView zauważyłem, że w Konstruktorze interfejsów wygląda on poprawnie. Ale kiedy działa w symulatorze, rozmiar (szerokość i wysokość) jest zawsze ustawiony na dowolny rozmiar obrazu; co oznacza, że ​​jeśli ustawię wysokość widoku obrazu na 50% pierwotną wysokość, obraz będzie nadal renderowany na pełnej wysokości.

Próbowałem również zrobić ten efekt z UIImage. Jednak pomimo tego, że rozmiar obrazu wydaje się prawidłowy, obraz jest skalowany w celu odzwierciedlenia proporcji/proporcji.

Pytanie: Jak mogę osiągnąć ten dynamiczny rozmiar (tzn. Animacja rozmiaru zdjęcia), podczas gdy NIE skaluje obrazu? Pomyślałem o użyciu CGImageCreateWithMask, ale jestem pewien, że spowodowałoby to ogromne problemy z wydajnością.

* Aktualizacja *

Efekt że im szuka to: Animacja obrazu przez co rosną w wysokości od do dołu (jak zestaw żaluzji jest wciągana na oknie). Ten obraz nie może być skalowany (ponieważ utraciłby efekt wizualny wyglądający jak "niewidomy"). Ten obraz musi być również renderowany na wierzchu innego obrazu. Tak więc są 2 obrazy łącznie.

* ODPOWIEDŹ *

Dla najwyższej najbardziej ImageView, ustawić tryb treści do góry (tak to robi skala). Następnie w kodzie ustawiam clipsToBounds na True. Teraz jestem w stanie animować najwyższą możliwą wysokość obrazu, dając mi efekt, którego szukam.

Odpowiedz

2

Jak wspomniano w oryginalnym post, tutaj jest odpowiedź wydaje mi się, że natknął :

Aby uzyskać najwyższy widok, ustaw tryb zawartości na Top (tak, aby nie był skalowany). Następnie w kodzie ustawiam clipsToBounds na True. Teraz jestem w stanie animować najwyższą możliwą wysokość obrazu, dając mi efekt, którego szukam.

0

Spróbuj ustawić właściwość UIImageView o wartości contentMode na jedną z następujących wartości.Myślę, że to, czego potrzebujesz to UIViewContentModeScaleAspectFit:

typedef enum { 
    UIViewContentModeScaleToFill, 
    UIViewContentModeScaleAspectFit,  // contents scaled to fit with fixed aspect. remainder is transparent 
    UIViewContentModeScaleAspectFill,  // contents scaled to fill with fixed aspect. some portion of content may be clipped. 
    UIViewContentModeRedraw,    // redraw on bounds change (calls -setNeedsDisplay) 
    UIViewContentModeCenter,    // contents remain same size. positioned adjusted. 
    UIViewContentModeTop, 
    UIViewContentModeBottom, 
    UIViewContentModeLeft, 
    UIViewContentModeRight, 
    UIViewContentModeTopLeft, 
    UIViewContentModeTopRight, 
    UIViewContentModeBottomLeft, 
    UIViewContentModeBottomRight, 
} UIViewContentMode; 
+0

Mogę osiągnąć efekt, który im szukam, jeśli używam UIViewContentModeTop. Ponownie, ten efekt wygląda prawidłowo w IB. Ale kiedy biegnę w symulatorze obraz jest ZAWSZE wyświetlany jako rzeczywisty rozmiar obrazu (zamiast rozmiaru określonego w IB). – AlvinfromDiaspar

+0

Jestem zdezorientowany twoim opisem. 1) Czy możesz opublikować kilka zrzutów ekranu? 2) Chociaż masz zestaw ustawień w IB, kod mógł zmodyfikować/przesłonić je podczas pracy. 3) Symulator może nie być dokładny, spróbuj przetestować na prawdziwym iPhonie. –

+0

Wyobraź sobie, że strona internetowa jest renderowana na bardzo wolnym połączeniu. Zasadniczo widzisz stronę rysowaną od góry do dołu. Zasadniczo chcę stworzyć ten efekt, w którym obraz jest obrazem 320x480 (UIImage lub UIImageView) przez powolne zwiększanie wysokości obrazu z y = 0 do y = 480. Tryb zawartości jest zdefiniowany jako Góra (tak, aby obraz nie był skalowany podczas zmiany rozmiaru obwiedni obrazu). – AlvinfromDiaspar

8

Użyj bloku animacji tak:

imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 0)]; 
imageView.image = ...; 
[imageView setClipsToBounds:YES]; 
[imageView setContentMode:UIViewContentModeTop]; 

[self.view addSubview:imageView]; 
[imageView release]; 

[UIView animateWithDuration:4.0f 
         delay:1.0f 
        options:UIViewAnimationOptionCurveEaseIn 
       animations:^(void) { 
        imageView.frame = CGRectMake(0, 0, 320, 480); 
       } 
       completion:NULL]; 
+0

Po prostu ciekawe, czy animacje blokują się lepiej niż przy użyciu ogólnych animacji UIView (gdzie jesteś i zatwierdzasz animację)? – AlvinfromDiaspar

+0

@AlvinfromDiaspar Są teraz zalecanym sposobem wykonywania animacji od wersji iOS 4. –

+0

@AlvinfromDiaspar Czy mój przykład działa? Przetestowałem to lokalnie i działa pięknie. –

2

tylko sugestia, że ​​masz dwa obrazy: A i X (obraz rentgenowski):

+-------+    +-------+ 
|  |    |  | 
|  |    |  | 
| A |    | X | 
|  |    |  | 
|  |    |  | 
+-------+    +-------+ 

Dynamicznie można stworzyć obraz wysokiej jednopikselowego (tEMP), skopiuj zawartość z X częściowo, umieścić go na szczycie:

+-------+ +-------+ +-------+ 
|  | | temp1 | < |  | 
|  | +-------+ |  | 
| A |    | X | 
|  |    |  | 
|  |    |  | 
+-------+    +-------+ 

w pętli, dynamicznie utworzyć/zmienić rozmiar obrazu Temp, a następnie skopiować więcej treści z X:

+-------+ +-------+ +-------+ 
|  | | temp2 | < |  | 
|  | |  | |  | 
| A | +-------+ | X | 
|  |    |  | 
|  |    |  | 
+-------+    +-------+ 

+-------+ +-------+ +-------+ 
|  | | temp3 | < |  | 
|  | |  | |  | 
| A | |  | | X | 
|  | +-------+ |  | 
|  |    |  | 
+-------+    +-------+ 
+-------+ +-------+ +-------+ 
|  | | temp4 | < |  | 
|  | |  | |  | 
| A | |  | | X | 
|  | |  | |  | 
|  | +-------+ |  | 
+-------+    +-------+ 

+-------+ +-------+ +-------+ 
|  | | tempX | < |  | 
|  | |  | |  | 
| A | |  | | X | 
|  | |  | |  | 
|  | |  | |  | 
+-------+ +-------+ +-------+ 
+0

Pomyślałem o tym, ale nie zrobiłem tego, bo wiedziałem, że będzie to naprawdę nieefektywne, i nie wspomnę już chyba o bardzo powolnym/wzburzonym. – AlvinfromDiaspar

+0

Nie otrzymałem zaktualizowanej odpowiedzi, założyłem, że zdjęcie rentgenowskie nie powinno być skalowane ... – ohho

0

Powinieneś rzucić okiem na Flip Clock dla samouczka na iPada. Jest z rdzeniem animacji, a więc ma premię wydajności.

+0

UH OH. WYGLĄD JAK PODSTAWOWAŁAŚ STRONĘ, KTÓRA NIE BĘDZIE ISTNIEJĄĆ. –