UIScrollView image / photo viewer with paging enabled and zooming

OK, myślę, że nadszedł czas, aby zrobić oficjalne miejsce w Internecie dla tego problemu: jak zrobić UIScrollView photoviewer z paging i zoom. Witajcie moi koledzy UIScrollView hakerzy.

Mam {[0] } z włączonym stronicowaniem i wyświetlam UIImageViews Jak wbudowana aplikacja Zdjęcia. (Czy to brzmi znajomo?)

Znalazłem następujący projekt na GitHubie:

Http://wiki.github.com/andreyvit/ScrollingMadness

Który pokazuje jak zaimplementować powiększanie w widoku przewijania podczas włączania stronicowania. Jeśli ktoś jeszcze tego spróbuje, musiałem usunąć UIScrollView podklasę i użyć natywnej klasy, w przeciwnym razie to nie zadziała. Myślę, że to z powodu zmian w SDK 3.0 odnoszących się do tego, jak widok przewijania przechwytuje zdarzenia dotykowe.

Chodzi więc o to, aby usunąć wszystkie pozostałe widoki po rozpoczęciu powiększania i przenieść bieżący widok do (0, 0) w scrollview, aktualizując contentsize itd. Następnie po powiększeniu do 1.0 f dodaje Pozostałe widoki z powrotem i wszystko wraca do porządku.

W każdym razie, ten projekt działa doskonale w symulatorze, ale na urządzeniu jest jakiś paskudny ruch widoku, który zmieniasz, co wygląda na to, że jest to spowodowane faktem, że zmieniamy rozmiar contentsize/offset itd. do zmiany rozmiaru widoku. W przeciwnym razie możesz przesuwać w lewo spację pozostawioną przez inne widoki.

Znalazłem jedną ciekawą notkę w "znanych problemach" 3.0 SDK release uwagi:

UIScrollView: po powiększeniu wstawka zawartości jest ignorowana, a zawartość pozostaje w niewłaściwej pozycji.
To brzmi jak to, co się tutaj dzieje. Po powiększeniu widok przesunie się poza ekran, ponieważ zmieniłeś offset itp.

Spędziłem nad tym już godziny i powoli dochodzę do smutnej świadomości, że to po prostu nie zadziała.

Three20 ' s photo viewer nie wchodzi w grę: jest zbyt ciężki i jest zbyt dużo niepotrzebnego interfejsu użytkownika i innych zachowań.

Wbudowana aplikacja fotograficzna wydaje się robić magię. Jeśli powiększysz obraz i przesuniesz go do skrajnych krawędzi, aktualne zdjęcie przesunie się niezależnie od zdjęcia obok, co nie jest tym, co uzyskasz, gdy spróbujesz tego ze standardowym UIScrollView.

Widziałem dyskusję na temat zagnieżdżania UIScrollView ' s, ale naprawdę nie chcę tam iść.

Czy ktoś sobie poradził ze standardem UIScrollView (i działa w SDK 2.2 i 3.0)? I don ' t fancy rolling mój własny zoom + bounce + pan + stronicowanie kodu.

Author: Ajumal, 2009-06-10

8 answers

Aktualizacja

Usunąłem moją poprzednią odpowiedź z powodu wiadomości poniżej...

Wielka wiadomość dla tych, którzy nie słyszeli. Firma Apple wydała 2010 WWDC session videos do wszystkich członków programu iPhone developer. Jednym z poruszanych tematów jest to, jak stworzyli aplikację Zdjęcia!!! Budują bardzo podobną aplikację Krok po kroku i udostępnili cały kod ZA DARMO.

Nie używa również prywatnego api. Oto link do przykładowego kodu do pobrania. Ty prawdopodobnie trzeba się zalogować, aby uzyskać dostęp.

Sprawdź To

A oto link do strony iTunes WWDC:

Sprawdź To

 43
Author: Jonah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-09 08:10:48

Napisałem prostą i łatwą w użyciu przeglądarkę zdjęć o nazwie MWPhotoBrowser . Postanowiłem go stworzyć, ponieważ Three20 był zbyt ciężki/nadęty, ponieważ wszystko, czego potrzebowałem, to przeglądarka zdjęć.

MWPhotoBrowser może wyświetlać jeden lub więcej obrazów, dostarczając Obiekty UIImage lub adresy URL do plików, obrazów internetowych lub zasobów biblioteki. Przeglądarka zdjęć bezproblemowo obsługuje pobieranie i buforowanie zdjęć z Internetu. Zdjęcia można powiększać i przesuwać, a opcjonalne (konfigurowalne) napisy mogą być wyświetlane. Przeglądarka może być również używana, aby umożliwić użytkownikowi wybranie jednego lub więcej zdjęć za pomocą widoku siatki lub głównego obrazu.

Mwphotobrowser Zrzuty Ekranu

 32
Author: Michael Waterfall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-13 17:58:07

Mówisz, że widziałeś dyskusje na temat zagnieżdżania UIScrollViews, ale nie chcesz tam iść - ale to jest droga! Działa łatwo i dobrze.

To w zasadzie to, co robi Apple w swoim przykładzie PhotoScroller (i rozmowa WWDC z 2010 roku związana w odpowiedzi Jonasza). Tylko w tych przykładach dodali całą masę złożonych kafelków i innego zarządzania pamięcią. Jeśli nie potrzebujesz płytek itp. a jeśli nie chcesz przebrnąć przez te przykłady i spróbować usunąć bity związane dla niego podstawowa zasada zagnieżdżania UIScrollViews jest w rzeczywistości dość prosta:

  • Utwórz zewnętrzny UIScrollView i ustaw jego pagingEnabled = true. Dodaj go do widoku głównego i ustaw jego szerokość i wysokość do szerokości i wysokości widoku głównego.

  • Utwórz tyle wewnętrznych UIScrollViews, ile chcesz obrazów. Ustaw ich szerokość i wysokość na szerokość i wysokość widoku głównego. Dodaj je jako podglądy do zewnętrznego widoku UIScrollView, każdy obok drugiego, po lewej racja.

  • Ustaw rozmiar zawartości zewnętrznego widoku UIScrollView na całkowitą szerokość wszystkich wewnętrznych widoków uiscrollview obok siebie (która jest równa [szerokość głównego widoku]*[liczba obrazów]).

  • Dodaj swoje obrazy ' UIImageViews do wewnętrznego UIScrollViews, jeden widok UIImageView do każdego wewnętrznego UIScrollView. Ustaw rozmiar zawartości każdego UIScrollView na rozmiar każdego UIImageView.

  • Ustaw skale powiększenia min i max dla każdego wewnętrznego UIScrollView i ustaw każdy z wewnętrzny delegat UIScrollView do kontrolera widoku. W widoku delegata forzoominginscrollview zwraca odpowiedni interfejs UIImageView dla przekazanego widoku uiscrollview. (Aby to zrobić, po prostu zachowaj każdy z UIImageViews w NSArray i ustaw odpowiednią właściwość tag UIScrollView na indeks odpowiedniego UIImageView. Następnie można odczytać znacznik w widoku UIScrollView przekazany do viewForZoomingInScrollView i zwrócić odpowiedni interfejs użytkownika z NSArray).

To jest to. Działa tak samo jak aplikacja do zdjęć.

Jeśli masz dużo zdjęć, aby zapisać pamięć, możesz mieć po prostu dwa wewnętrzne UIScrollViews i dwa UIImagesViews. Następnie dynamicznie obracasz między nimi, przesuwając ich pozycję w zewnętrznym widoku UIScrollView i zmieniając ich obrazy, gdy użytkownik przewija zewnętrzny widok uiscrollview. To trochę bardziej skomplikowane, ale ta sama zasada.

 19
Author: delany,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-28 06:20:40

Trochę pobawiłem się natywną aplikacją Zdjęcia i myślę, że mogę śmiało powiedzieć, że używają jednego UIScrollView. Prezent jest taki: powiększ obraz i pociągnij w lewo lub w prawo. Zobaczysz następne lub poprzednie zdjęcie. Jeśli przeciągniesz wystarczająco mocno, będzie nawet strona do następnego zdjęcia z zoomem 1.0 F. Odwróć, a wcześniej powiększone zdjęcie również wróci do zoomu 1.0 F.

Nie pisałem Zdjęć.app, ale zgadnę, jak to zrobili it:
  • pojedynczy UIScrollView i pojedynczy uiscrollviewdelegate
  • uzupełnij uiscrollview o dzieci UIImageView
  • Posłuchaj scrollViewDidScroll:
  • Policz sobie i dowiedz się na jakiej stronie aktualnie jesteś
  • Posłuchaj viewForZoomingInScrollView:
  • zwraca inny widok w zależności od indeksu strony
  • słuchaj scrollViewDidEndZooming:withView:atScale: i opcjonalnie wykonaj antyaliasing, itp. na podstawie zawartości

Jeśli zdecydujesz się to wypróbować, daj mi znać, jak to działa na Ciebie. Chciałbym wiedzieć, jak w końcu udało ci się to wypalić. Jeszcze lepiej, wyślij to na github.

 6
Author: slf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-08 17:54:41

Pobawiłem się trochę z natywne Zdjęcia aplikacji, i myślę, że mogę powiedzieć z pewnością, że używają pojedynczy UIScrollView. Prezentów jest to: powiększ obraz i pociągnij do w lewo czy w prawo. Zobaczysz następne lub poprzednie zdjęcie. Jeśli ciągniesz wystarczająco mocno, będzie nawet strona do następne zdjęcie z zoomem 1.0 F. Odwróć i wcześniej powiększone zdjęcie będzie powrót do zoomu 1.0 f, jak również.

To jest złe. Używam zagnieżdżonych podglądów przewijania i uzyskanie dokładnie tego samego efektu. Jeśli używasz jakiegoś schematu zarządzania pamięcią (który musiałem zacząć używać... mój numer strony jest dość wysoki ('bout 50 każdy w 2 przewijania)), następnie można użyć mechanizmu podobnego do tego, co masz wyzwalanie ładuje / rozładowuje strony do wyzwalania Reset zoom dla stron -1 i +1 z bieżącej strony.

Podejrzewam, że apple odpala to jak tylko zniknie poprzednie zdjęcie.

Nie rozumiem, jak osiągnąć gładką przewijanie między stronami-zawsze jest bardzo krótki powiesić w momencie przejścia. Nie rozumiem. Dostałem się dość głęboko do naprawienia go - NSInvocationOperations były moim pierwszym przystankiem, a następnie zrobiłem kolejkę widoki wielokrotnego użytku dla odsłon strony (które zachowują swoje widoki obrazu)... nadal to durned hang.

Mam tylko jeden nsoperationqueue uruchomiony, i próbowałem majstrować z maksymalną liczbą jednoczesnych operacji. Myślałem, że główny wątek jest zapychany przez konkurowanie Kolejkami, a może nawet jedną kolejką... mimo to, powieszenie.

Próbowałem nawet stworzyć super niskowartościowe wersje moich mediów, na wypadek gdyby to był problem. Z każdym obrazem ważącym około 10k (to są JPEG, pamiętajcie)... zgadłeś. Wieszak wciąż tam jest.

Jestem prawie zdecydowany zrobić to, co robiłem wcześniej i użyć TTPhotoViewController z Three20. Spędziłem kilka godzin, pływając przez ten kod, i to zawsze jest świetna Edukacja. W tym momencie, chociaż, naprawdę chciałbym wiedzieć, skąd się wziął ten hang, jeśli tylko po to, żebym mógł spędzić moje godziny bezsenności zastanawiając się nad czymś mniej wrzenia mózgu.

 1
Author: beOn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-14 17:31:34

Byłoby miło, gdyby apple zbudował przeglądarkę obrazów, taką jak aplikacja zdjęcia w SDK, z której możemy korzystać. Obecnie używam three20 i działa świetnie. Ale jest wiele dodatkowych rzeczy do noszenia, gdy wszystko, czego naprawdę chcesz, to przeglądarka zdjęć.

 0
Author: Francois,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-11 21:55:24

Piszę do tego kod i może być jako odniesienie

  1. Wczytaj bieżący widok scrollview i imageview .. a dla ekranu obok bieżącego widoku , tylko imageview

  2. Usuń Cały Widok, gdy bieżąca strona ładuje się, aby zapisać pamięć, tak dobrze dla wielu projektów fotograficznych

  3. Użyj znacznika, aby odróżnić różne scrollview

pierwsza strona_xxxxslidexxx zoom

Link do pobrania Kliknij tutaj

 0
Author: chings228,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-07 09:11:45
 -1
Author: Rafael Vega,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-17 18:55:57