Aby wyjaśnić cel tego pytania: Wiem JAK tworzyć skomplikowane widoki zarówno z podwidokami, jak i przy użyciu drawRect. Staram się w pełni zrozumieć, kiedy i dlaczego należy używać jednego nad drugim.
Rozumiem też, że nie ma sensu optymalizować tak dużo wcześniej i robić coś trudniejszego przed wykonaniem jakiegokolwiek profilowania. Pomyśl, że czuję się komfortowo z obiema metodami i teraz naprawdę chcę głębszego zrozumienia.
Wiele mojego zamieszania wynika z uczenia się, jak sprawić, by przewijanie widoku tabeli było naprawdę płynne i szybkie. Oczywiście oryginalne źródło tej metody pochodzi od autora Twittera na iPhone'a (dawniej tweetie). Zasadniczo mówi się, że aby przewijanie tabeli było płynne, sekret polega na tym, aby NIE używać podglądów podrzędnych, ale zamiast tego robić wszystkie rysunki w jednym niestandardowym widoku. Zasadniczo wydaje się, że użycie wielu podglądów podrzędnych spowalnia renderowanie, ponieważ mają one dużo narzutów i są stale ponownie zestawiane z widokami nadrzędnymi.
Aby być uczciwym, zostało to napisane, gdy 3GS był całkiem nowy, a iDevices stały się znacznie szybsze od tego czasu. Mimo to ta metoda jest regularnie sugerowana w interwebach i innych miejscach w przypadku tabel o wysokiej wydajności. W rzeczywistości jest to sugerowana metoda w kodzie przykładowego kodu tabeli firmy Apple , została zasugerowana w kilku filmach WWDC ( praktyczne rysowanie dla programistów iOS ) i wielu książkach o programowaniu iOS .
Istnieją nawet niesamowicie wyglądające narzędzia do projektowania grafiki i generowania dla nich kodu Core Graphics.
Więc na początku sądzę, że „istnieje powód, dla którego istnieje Core Graphics. Jest SZYBKI!”
Ale gdy tylko myślę, że przychodzi mi do głowy pomysł „Korzystaj z grafiki rdzenia, kiedy to możliwe”, zaczynam dostrzegać, że drawRect jest często odpowiedzialny za słabą responsywność aplikacji, jest niezwykle kosztowny pod względem pamięci i naprawdę obciąża procesor. Zasadniczo powinienem „ unikać zastępowania drawRect ” (WWDC 2012 iOS App Performance: Graphics and Animations )
Więc myślę, że jak wszystko jest skomplikowane. Może pomożesz sobie i innym zrozumieć, kiedy i dlaczego warto używać drawRect?
Widzę kilka oczywistych sytuacji podczas korzystania z Core Graphics:
- Masz dane dynamiczne (przykład wykresu giełdowego Apple)
- Masz elastyczny element interfejsu użytkownika, którego nie można wykonać za pomocą prostego obrazu o zmiennym rozmiarze
- Tworzysz dynamiczną grafikę, która po wyrenderowaniu jest używana w wielu miejscach
Widzę sytuacje, w których należy unikać Core Graphics:
- Właściwości widoku muszą być animowane osobno
- Masz stosunkowo małą hierarchię widoków, więc każdy dostrzegalny dodatkowy wysiłek przy użyciu CG nie jest wart korzyści
- Chcesz zaktualizować fragmenty widoku bez przerysowywania całości
- Układ widoków podrzędnych należy aktualizować, gdy zmienia się rozmiar widoku nadrzędnego
Więc obdarz swoją wiedzą. W jakich sytuacjach sięgasz po drawRect / Core Graphics (można to również osiągnąć za pomocą podglądów podrzędnych)? Jakie czynniki doprowadziły Cię do takiej decyzji? Jak / dlaczego rysowanie w jednym niestandardowym widoku jest zalecane do płynnego przewijania komórek tabeli, ale Apple odradza drawRect ogólnie ze względu na wydajność? A co z prostymi obrazami tła (kiedy tworzysz je za pomocą grafiki komputerowej, a nie obrazu png o zmiennym rozmiarze)?
Dogłębne zrozumienie tego tematu może nie być potrzebne do tworzenia wartościowych aplikacji, ale nie lubię wybierać między technikami bez możliwości wyjaśnienia dlaczego. Mój mózg się na mnie wścieka.
Aktualizacja pytania
Dziękuję wszystkim za informację. Kilka pytań wyjaśniających:
- Jeśli rysujesz coś z podstawową grafiką, ale możesz osiągnąć to samo dzięki UIImageViews i wstępnie renderowanemu png, czy zawsze powinieneś iść tą drogą?
- Podobne pytanie: Zwłaszcza w przypadku narzędzi takich jak ten , kiedy należy rozważyć rysowanie elementów interfejsu w podstawowej grafice? (Prawdopodobnie gdy wyświetlanie twojego elementu jest zmienne. Np. Przycisk z 20 różnymi wariantami kolorystycznymi. Czy są jakieś inne przypadki?)
- Biorąc pod uwagę moje rozumienie w mojej odpowiedzi poniżej, czy ten sam wzrost wydajności dla komórki tabeli można uzyskać, efektywnie przechwytując bitmapę obrazu komórki po samym renderowaniu złożonego UIView i wyświetlając ją podczas przewijania i ukrywania złożonego widoku? Oczywiście niektóre elementy należałoby opracować. Miałem tylko interesującą myśl.