2010-04-23 18 views
7

Potrzebuję stworzyć widok na iPhone'a, który przewija się poziomo przez galerię obrazów. Problemem jest to, że ta galeria może mieć od 100 do 1000 zdjęć, które należy przedstawić, więc chciałbym uniknąć ładowania ich wszystkich w jeden UIScrollView jednocześnie i niszczenia wydajności. Potrzebuję utworzyć widok, który przetwarza obiekty widoku (takie jak UITableView), aby zwiększyć wydajność i zmniejszyć obciążenie pamięci, ale musi być przewijany w poziomie.Poziomo przewijany stół iPhone

Wszelkie pomysły? Czy możliwe jest wykonanie operacji UITableView w poziomie?

Dzięki!

Odpowiedz

1

Można użyć dużego przewijania i monitorować zmianę pozycji przewijania. Możesz dodawać obrazy jako subviews, ponieważ przychodzą one do rzeczywistego widocznego obszaru i usuwać je, gdy są przewijane.

W ten sposób musisz mieć tylko niewielką liczbę wyświetleń obrazu w danym momencie, ale możesz sprawić wrażenie, że wszystkie są "tam".

Można nawet poddać recyklingowi widoki obrazów, zmieniając ich obraz i lokalizację, aby nie tworzyć i nie niszczyć złożonych obiektów. To właśnie robi UITableView z komórkami.

+0

Dzięki za przemyślenia. Miałem nadzieję, że będzie sposób na wykorzystanie mechanizmu recyklingu w systemie operacyjnym i nie będę musiał tego wszystkiego zarządzać w moim własnym kodzie ... ale spróbuję z tym zrobić i zobaczę, jak to działa. – Devunwired

+0

Istnieje sposób użycia UITableViewController, zapoznaj się z moją odpowiedzią poniżej –

0

Czy można dodać widok UITableView w poziomie? W innej orientacji niż ekran. Następnie możesz użyć zwykłej semantyki UITableView, gdzie każdy wiersz jest obrazem, który przewija się poziomo zamiast pionowo.

-1

myślę, że mam odpowiedź dla Ciebie O przewijając się UITableView Poziomo:

  1. utworzyć UIScrollView (i wyłączyć pionowego przewijania)
  2. położyć UITableView wewnątrz zwoju widok
  3. zmiany szerokość widoku tabeli jako życzysz sobie i zaktualizuj UIScrollView.contentSize jako tabelę o szerokości tableView width
+0

Dodanie widoku tabeli nie powoduje przewijania w poziomie, niezależnie od szerokości. – David

2

Jest to tak proste, jak zastosowanie transformacji.

Oto kod. Napisz to w swoim instrumencieViewController init:

self.view.frame = CGRectMake(100,-5,250,350); //any Frame of your choice 
CGAffineTransform trans = self.view.transform; // get current transform (i.e. portrait) 
trans = CGAffineTransformRotate(trans, (M_PI/-2.0)); // rotate 90 degrees to go landscape 
self.view.transform = trans; // set current transform (landscape) 

Ale teraz musisz zdać sobie sprawę, że twoja oś jest również zamieniona. Wszelkie zmiany dokonane na wysokości zmienią szerokość (i odwrotnie), a wszelkie zmiany wprowadzone w origin.x zmieniają origin.y (i na odwrót)

+1

Chcesz "eg", a nie "ie" - From [Wikipedia] (http://en.wikipedia.org/wiki/List_of_Latin_abbreviations): "eg" to "exempli gratia" ("na przykład", "na przykład"); "ie" to "id est" ("to jest", "innymi słowy") – Thromordyn

+0

Przeprosiny. Mój błąd. Dziękujemy za korektę @Thromordyn –

0

Wysyłanie odpowiedzi na ten stary wątek, ponieważ zweryfikowana odpowiedź nie jest poprawne. Możesz użyć kontrolera UITableViewController i jego funkcji dequeueReusableCellWithIdentifier.

Sztukę polega na obracaniu widoku stołu, a następnie obróceniu komórki w przeciwnym kierunku.

w viewDidLoad można dodać:

self.view.transform = CGAffineTransformMakeRotation(-M_PI_2); 

A potem w cellForRowAtIndexPath użyłbyś:

cell.containerView.transform = CGAffineTransformMakeRotation(M_PI_2); 

Upewnij się, że każda treść swojej komórce dodaje do widoku kontenera (w tym przykładzie containerView), więc wystarczy obrócić pojemnik, a nie wszystkie podzbiory komórki.

Należy również pamiętać, że będzie działał lepiej z komórkami o wymiarach kwadratowych, ponieważ w przeciwnym razie można zmagać się z obliczeniami wysokości/szerokości.