2010-04-07 7 views
5

To naprawdę nie jest pytanie, ponieważ właśnie rozwiązałem problem, ale myślę, że charakter problemu jest wspólny dla wielu twórców iPhone'a, a rozwiązanie nie było tak oczywiste, więc chciałem podziel się moim doświadczeniem. Aby zachować format "pytanie/odpowiedź" StackOverflow, zamierzam umieścić w pytaniu szczegóły dotyczące pytania i moje rozwiązanie.Wydajność przewijania UITableView z CALayer + maska ​​

Szczegóły:

miałem tableview pełne komórek z dwóch etykiet i kontroli zwyczaj przełącznik ułożyła od zera. Jeśli ukryłem kontrolę, widok tabeli przewinął się jak mistrz. Jednak przy wyświetlonej kontrolce przełączania przewijanie było boleśnie niepewne/wolne w telefonie iPhone 3G. Moje komórki widoku tabeli nie mają przezroczystych komponentów (innych niż maska ​​dla warstwy) i ponownie używam komórek.

Niestandardowa kontrola przełączania rozszerza UIButton, a jego warstwa ma dwa komponenty - UIImageView, który zawiera przesuwającą się część przełącznika i podłużną elipsę, która jest używana jako maska, z tłem narysowanym za warstwą w -drawRect: .

Jak to naprawić? Odpowiedź wkrótce ...

Odpowiedz

6

Dowiedziałem się, że źródło powolności/chropowatości pochodziło z konieczności ponownego złożenia warstwy z podwarstwa maski podczas przewijania. Sądzę, że trzeba było ponownie narysować przełącznik przy każdym ponownym rysowaniu ekranu.

Moim rozwiązaniem jest ukrycie warstwy/maski przełącznika, chyba że zmienia stan. Gdy siedzi całkowicie w pozycji włączonej lub wyłączonej, ukrywam warstwę przełącznika i zastępuję ją obrazem przełącznika. Gdy użytkownik dotknie przełącznika, ukryty obraz ukryje się, rzeczywisty przełącznik przełączania przełączników pokazuje i wykonuje animację w przeciwnym stanie. Po zakończeniu animacji ukrywam komponent przełącznika przełączników i pokazuję fikcyjny obraz, upewniając się, że zmieniłem obraz na bieżący stan. Poprawiona wydajność przewijania ZNACZĄCO ... Ośmielę się powiedzieć, że jest prawie tak dobra, jak natywna domyślna komórka tabeli.