2009-04-05 14 views
7

Mam UIScrollView z obrazami w nim. Gdy użytkownik dojdzie do ostatniego obrazu i przesunie palec w celu wyświetlenia następnego zdjęcia, chcę pokazać pierwsze zdjęcie. Podobnie, gdy użytkownik znajduje się na pierwszym obrazie i przesuwa palcem po poprzednim obrazie, chcę wyświetlić ostatni obraz. W skrócie, będzie to kolista rzecz.Circular UIScrollView

Jak mogę to wdrożyć?

Odpowiedz

6

Będziesz musiał pracować z contentOffset i contentSize.

Za każdym razem, gdy występuje zdarzenie przewijania, można rozważyć sprawdzenie, czy użytkownik ma na przykład currentLength - 1, a jeśli tak, to dynamiczne dodawanie obrazu do przewijania.

Powinno to zadziałać, aby uzyskać wartość 5, ale może spowodować problemy w zakresie pamięci, jeśli nie zwolni się wcześniejszych obrazów.

I nie sądzę, że to rozwiązanie będzie pracować z obrazami mniej niż indeks 0.

przemian ... Powiedzmy, że masz zdjęć I1 do I5. Układ przewijania z następującymi obrazkami: I5 I1 I2 I3 I5 I5 I1

Automatyczne przewijanie do I1 (wysokość I5), bez animacji.

Jeśli użytkownik kiedykolwiek przewinie nad tym znakiem, automatycznie przewiń je (bez animacji) do drugiej pary I5 I1. Jeśli użytkownik kiedykolwiek spróbuje przewinąć poniżej I5 pod koniec, możesz automatycznie przewinąć je z powrotem do pierwszej pary I5 I1. Jeśli przewiniesz bez animacji i do prawidłowej wysokości, okaże się, że obrazy są nieskończone.

Nie jestem pewien, czy to będzie bardzo czułe, ale może dać efekt, na który patrzysz.

+0

To prawie wszystko, co zrobiłem w jednej z moich aplikacji. To działa dobrze. –

+3

To nie działa, jeśli ruch widoku ma być ciągły. O ile nie można przewijać gdzieś z określoną prędkością. – Dimitris

+0

To rozwiązanie działa poprawnie z włączoną obsługą stronicowania. – redent84

2

Kluczową rzeczą do zrealizowania jest to, że UIScrollView jest bardzo inteligentny w tym, co przerysowuje.

Możesz przenosić jego widoki podrzędne i tak długo, jak widoki widoczne na ekranie nie przesuwają się ani nie zmieniają, nie ma odświeżania. Możesz zresetować ramkę wszelkich subskrybentów poza ekranem (i jeśli to konieczne dostosować opcję contentOffset) bez powodowania przerysowywania.

Oczywiście włączenie opcji stronicowania sprawia, że ​​jest to o wiele łatwiejsze, ale jestem pewien, że możesz to zrobić również z didScroll.

Powinieneś wygenerować 5 widoków, dodaj je jako subviews i ustaw przesunięcie przewijania na środek piątki. Podczas przewijania scrollView możesz przełączać się do subskrybentów - tak jak robin round. Nie ma potrzeby usuwania i ponownego dodawania subskrybentów, możesz po prostu zresetować ramki.

To jest (na prostym poziomie) sposób działania UITableView - ponownie wykorzystuje mały zestaw widoków komórek i resetuje przesunięcie treści.