2014-10-27 5 views
7

Czy należy wywołać rysunek CAShapeLayers z drawRect() lub layoutSubviews()?Niestandardowy rysunek UIV z układem Odsłony kontra drawRect

Zgodnie z dokumentacją Apple na UIViews operacje rysowania powinny być umieszczone w drawRect().

Nie dotyczy to jednak sesji WWDC Kevina Catheya: What's New in Interface Builder (gdzie demonstruje proces budowania niestandardowego interfejsu UIView dostępnego w programie Interface Builder).

Podczas swojej demonstracji wykonuje rysunek widoku w postaci layoutSubviews zamiast drawRect.

Jego wyjaśnienie, że:

Gdybym zaimplementować drawRect, że nie będzie się nam najlepsze osiągi; mając na uwadze, że używanie podwarstw i subskrybentów zapewni nam naprawdę dobrą wydajność.

Z tego co dotychczas przeczytałem na temat StackOverflow, wydaje się, że przesłonięcie metody drawRect() może spowodować obniżenie wydajności. Częściowo wynika to z tego, że setNeedsDisplay powoduje, że ręczne odświeżanie jest kosztowne.

Ale przeglądając dokumenty Apple i aplikacje rzeczywistego świata. Ma to sens, że drawRect() powinien być odpowiedzialny za rysowanie położenia i pozycjonowanie.

Odpowiedz

1

Powiedziałbym, że to zależy. Jeśli rozmiar twojego kształtu będzie zależeć od układu Auto Layout, może być korzystne wykonanie rysunku w Subview układu a Draw Remekt.

Po pierwsze, dlaczego podstrony układu miałyby kiedykolwiek lepszą wydajność? Dobrze mówię, że mam UIView (mój widok rodzica), który rysuje Widok Kręgu (mój podzbiór), który używa warstwy kształtu. Rozmiar tego okręgu jest określony przez ograniczenie Width i Height w moim widoku rodzica. Muszę przerysować kółko tylko wtedy, gdy ograniczenia szerokości/wysokości zostaną zmienione w widoku rodzica. Jest to instancja, w której korzystne jest posiadanie kodu rysunku w subksiążach układu, ponieważ muszę tylko przerysować warstwę kształtu, gdy zmieniają się wiązania. Zobaczmy cyklu Auto Layout

  1. Ograniczenia Aktualizuj
  2. Układ subviews
  3. Render poglądy

przez subviews układ czasowych nazywa znamy rozmiar ramki pracujemy zi możemy bezpiecznie wykonać nasz rysunek. Wiem, że dokumentacja mówi, że powinieneś użyć tej metody, aby ustawić ramkę, krawędzie itp. Jednak rysowanie wewnątrz ramy nie brzmi nierozsądnie w zależności od okoliczności.

Jeśli widok kołowy nie jest zależny od układu automatycznego układu i może być zmieniony w dowolnym czasie, niezależnie od układu interfejsu użytkownika, prawdopodobnie lepszym rozwiązaniem będzie rysowanie w trybie rysowania rect, aby można było go stale wyświetlać. zaktualizowany. Uważam, że jest to mniej niż idealna sytuacja, ponieważ więcej interfejsów użytkownika w systemie iOS jest zgodnych z korzystaniem z automatycznego układu, stąd zalecenie korzystania z subviews układu.