2013-09-24 5 views
5

Jeśli utworzyć podklasy UIView i chcą korzystać kilka niestandardowych wykonane treścią (animacje poprzez CABasicAnimation pomocą CAShapeLayer s, niestandardowe wykonanych rysunków za pomocą CGContextRef w drawRect), gdy czy jest odpowiedni czas na tworzenie, dodawanie i animowanie podwarstw?Kiedy jest odpowiedni czas, aby animować i dodać podwarstwy w podklasie UIView

Wiem, że powinienem wykonać niestandardowe rysunki w metodzie drawRect (a ponieważ jest to jedyne miejsce, w którym mogę uzyskać UIGraphicsGetCurrentContext(), ten rodzaj zawęża mój wybór). Teraz tworzę podwarstwy, animacje i wszystkie inne nie związane z rysowaniem rzeczy również w drawRect. Ale nie jestem pewien, czy to najlepsze miejsce do robienia tego rodzaju zajęć.

Jestem zaznajomiony z metodą layoutSubviews i niektórymi innymi metodami UIView, ale nie zaimplementowałem żadnego z nich z wyjątkiem drawRect.

Więc jeśli powtórzę się jeszcze raz - pojawia się pytanie: Gdzie dodać podwarstwy, skąd je animować i czy są jakieś sztuczki lub połowy, o których powinienem wiedzieć?

Odpowiedz

7
  1. Możesz tworzyć i dodawać warstwy w init, jeśli są trwałe. Jeśli są dynamiczne, layoutSubviews jest lepszy. To oczywiście oznacza, że ​​musisz ustawić NeedsLayout, gdy wymagana jest nowa warstwa/element. Możesz mieszać i dopasowywać tyle, ile chcesz, między -init i -layoutSubviews, ale gdybym musiał wybrać, powiedziałbym, że skłania się do korzystania z layoutSubviews. Nie używaj drawRect.

  2. Możesz ustawić właściwości (strokeWidth, lineColor, path, etc) na CAShapeLayer w czasie tworzenia lub podczas normalnego wykonywania. Obejmuje to ustawienie ścieżki do CAShapeLayer. Ponownie, nie ustawiaj właściwości w drawRect.

  3. Jeśli chcesz wykonać niestandardowy rysunek na warstwie, możesz podklasować warstwę i użyć drawRect na tej warstwie. Może to być dobre, jeśli CALAyery wymagają ponownego użycia i rozszerzenia. Możesz także dostarczyć CALayerDelegate, o ile nie jest to UIView. Patrz na te pytania: Using CALayer DelegateI iOS: Using UIView's 'drawRect:' vs. its layer's delagate 'drawLayer:inContext:'

  4. Animacja jest łatwe, a wynika z tych samych zasad, jak tworzenie i ustawiania właściwości. Upewnij się, że rozumiesz, gdy automatyczne animacje zostanie wywołany i jak je wyłączyć: Disabling implicit animations in -[CALayer setNeedsDisplayInRect:] Znowu nie starają się animować z drawRect: How to make my UIBezierPath animated with CAShapeLayer?

  5. Rysunek jest drogie. Animacja jest tania. Używanie drawRect za dużo spowoduje duże trafienie wydajności w twoich aplikacjach. Użyj oszczędnie drawRect/setNeedsDisplay, na przykład przy zmianie stanu (zaznaczone/niezaznaczone). O ile to możliwe, modyfikuj widoki za pomocą animacji lub właściwości na najwyższym poziomie i nie przerysuj widoku. Robienie drawRect cokolwiek innego niż draw może spowodować niepotrzebne wywoływanie setNeedsDisplay. Łatwa optymalizacja z góry polega na tym, że wywołanie drawRect jest możliwie najmniejsze lub wcale.

+0

Dziękuję. Dlaczego nie zaleca się animowania z drawRect? – Majster

+0

Tęskniłem za tym punktem, a to jest biggie. Zmieniono moją odpowiedź. – Saltymule