2011-02-06 12 views
21

Korzystając z UITableView, możemy ponownie wykorzystać jego komórki metodami [[ UITableViewCell alloc] initWithStyle: reuseIdentifier:] i [uiTableViewInstance dequeueReusableCellWithIdentifier:]. Pomaga to utrzymać pamięć w ryzach przy dużych stołach, ponieważ w danym momencie w widoku jest tylko kilka komórek.Jak ponownie użyć/zutylizować niestandardowy element, taki jak uitableviewcell?

Chcę utworzyć UIScrollView, który ma wiele subviews. Wstawienie wszystkich subviews wymaga dużej pamięci i początkowego czasu, którego chcę uniknąć. Czy Apple API oferuje sposoby ponownego użycia takich niestandardowych składników (UIView lub jego podklasy tutaj), podobnie jak widoki komórek z wykorzystaniem identyfikatora?

Będę je tworzyć, jeśli nie ma API, ale mam pewne wątpliwości co do tego. Na przykład dla każdego nowego podglądu ustawiam pozycję ramki po widokach poprzednich. W jaki sposób powinienem zaktualizować ramkę dla każdego wydziału podczas recyklingu? Czy powinienem usuwać i ponownie ładować zawartość każdego z wyeksportowanych elementów? Czy powinienem wykonać wszystkie te obliczenia w innym wątku, aby uniknąć szarpanego przewijania? W sumie chciałbym mieć płynne przewijanie, takie jak w UITableView z wszystkimi reusingami.

Oto przykład kodu, który napisałem do tej pory:

int numberOfPages = 0; 
int pageWidth = 100; 
int pageHeight = 100 

UIScrollView *myScrollView = //allocate and initialize a scrollview 
//set its size to 100 by 100 (width equal to pageWidth) 
//set paging enabled for myScrollView 

Dodawanie subviews do niego z metody, która jest wywoływana wielokrotnie

- (void) appendSubViewToScrollView { 
    UIView *view = //allocate and initialize a view and dump data in it. 

    CGRect rect = view.frame; 
    rect.size.height = pageHeight; 
    rect.size.width = pageWidth; 
    rect.origin = CGPointMake(pageHeight * numberOfPages, 0); 
    view.frame = rect; 

    [myScrollView addSubview:view]; 

    numberOfPages++; 

    [scrollView setContentSize:CGSizeMake(pageHeight * numberOfPages, pageWidth)]; 

    [view release]; 
} 

Edit:
pewien wgląd sposób, w jaki widok tabeli i jego komórki osiągną to za kulisami, byłby użyteczny.

Odpowiedz

19

Tak, należy każdorazowo przywracać zawartość każdego z widoków, tak jak w widoku tabeli. Zaletą recyklingu subviews jest oszczędzanie pamięci do przechowywania widoków i oszczędność czasu dla alokacji widoków, ale oczywiście zarządzanie danymi treści należy do Ciebie.

Standardowe podejście do recyklingu wymaga użycia liczby komórek równej liczbie widoków widocznych w tym samym czasie na ekranie + liczby dodatkowych komórek, które można uzyskać podczas uruchamiania przewijania. Załóżmy na przykład, że wyświetlasz 5 pełnych widoków na raz (widok przewijania jest stabilny), a następnie podczas przewijania będziesz potrzebował jednego dodatkowego widoku, który jest częściowo pokazany, więc na końcu potrzebujesz 5 + 1 = 6 widoków. To jest teoretycznie, zaleca się użycie jeszcze 2 widoków. Należy więc napisać dwie pule: jedną o nazwie "visibleViews", która składa się ze wszystkich widoków dodanych jako subviews do scrollview, a druga o nazwie "availableViews", która składa się ze wszystkich widoków dostępnych do ponownego wykorzystania. Następnie tworzysz wszystkie te widoki i dodajesz je do widoku przewijania (tak: musisz dostosować ramkę zgodnie z ich pozycją w przewijanym widoku, i tak, musisz ponownie skonfigurować zawartość). Na koniec musisz śledzić ruch widoku przewijania, ustawiając delegata. Celem tego śledzenia jest obliczenie, który z widocznych widoków nie jest już widoczny, a następnie usunięcie go z widocznej puli i przejście do puli używanej. Poza tym delegat musi wiedzieć, kiedy pojawi się nowa komórka, ale nadal nie jest widoczna, a następnie pobierać ją z dostępnej puli (lub przydzielać/inicjować, jeśli pula jest pusta) i dodawać do widocznej puli oraz jako podgląd. przewijania. Oczywiście, jeśli chcesz zwiększyć wydajność, możesz umieścić więcej subskrybentów w widoku przewijania, aby uniknąć przenoszenia komórek dokładnie wtedy, gdy zaczynają pojawiać się na ekranie, dlatego zaleciłem użycie kilku dodatkowych widoków po bokach zwoju widok.

Jest świetny film z WWDC 2010 (można uzyskać do niego dostęp, jeśli jesteś zarejestrowanym programistą) na temat używania widoków przewijania w iOS: wyjaśnia tę technikę.

Kod przykładowy Apple PhotoScroller w dokumentacji XCode w zasadzie to, co jest podane w wideo WWDC i wyjaśnia tę technikę.

+0

Dzięki za odpowiedź Viggio. Czy jest jakiś kod związany z tym? Mógłbym użyć jakiegoś odniesienia. I tak, jestem zarejestrowanym programistą. Czy możesz wskazać odpowiedni film dla tej sprawy? ("Ramy aplikacji"? Będę obserwować resztę w wolnym czasie). Pobrałem też przykładowy kod. Wygląda interesująco i użytecznie. – Sailesh

+0

Zaznacz tę odpowiedź jako zaakceptowaną za pomocą znacznika wyboru (pod strzałkami do głosowania w górę/w dół). – JoePasq

+1

Niestety nie pamiętam, co jest filmem wyjaśniającym tę technikę, ale pamiętam, że zostało to wyjaśnione za pomocą demo. Jest film wideo "Projektowanie aplikacji z widokami przewijania", ale nie jestem pewien, czy jest to odpowiedni film, w każdym razie warto na niego patrzeć (wyjaśnia kilka pięknych technik). Strona główna wideo WWDC zaczyna się tutaj: http://developer.apple.com/videos/wwdc/2010/ od miejsca, w którym zalogujesz się na swoje konto programisty, a następnie będziesz mógł otworzyć iTunes i pobrać lub po prostu obejrzeć filmy. Ten, o którym mówię, to 104 ("Projektowanie aplikacji z widokami przewijania"). – viggio24

Powiązane problemy