Oct 072012
 

UIViewと描画に関する一連のまとめ。setNeedsDisplayとdrawRectの関係、CALayer(CoreLayer)とdrawInContextの関係、setNeedsLayoutとlayoutSublayersの利用法。動作の流れの図解。

UIViewの描画の図解

UIViewの描画メソッドのまとめ記事である前回記事の図解による再まとめである。

UIViewControllerにUIViewが一つホストされている状態。そしてさらにLayerが入れ子になっている状態。以下は図中のUIViewとCALayer(subviews/sublayers)構造の概要。

  • controller(UIViewController)
    • view(self.viewであり、UIViewのインスタンス)
      • view(self.subviewsの中の一個、ユーザが貼付けた)
      • layer(self.layerであり、UIViewには必ず一個は存在する、システムが用意したlayer)
        • layer(ユーザが貼付けたレイヤー)
        • layer(ユーザが貼付けたレイヤー)
        • layer(ユーザが貼付けたレイヤー)

基本のセットはレイヤーもビューも同じである。

  • UIViewには描画を行うメソッドと再配置を行うメソッドがある。
  • CALayerには描画を行うメソッドと再配置を行うメソッドがある。
一般的に海外の開発者情報を集約していくと出来る限り再描画をしない事がパフォーマンス向上につながるという結論。描画の回数を減らし、描画範囲を減らしというイメージ。再配置と再描画は異なる。

時系列で追う描画メソッドの流れ

drawRectは描画メソッドであり、UIViewの再描画を行う。

通常UIView全体を再描画する為に使うが、描画高速化を睨んだ場合は、子のlayerやviewに細分化し、サイズ変更するオブジェクト(表示要素)を小さい単位で管理し、必要最低限のFrameサイズ変更、UIViewやCALayerの新たな追加や削除、CALayer内での再描画になるようにするのが望ましい。

つまりUIViewControllerが管理するUIView(self.viewに該当)のdrawRectで単一のviewで単一のlayerで構成されている状態で再描画を行うと画面全体が常に描画となる。背景が一切変化しないならUIView(self.view)に描画し、位置が変更出来るものはsublayerとして描画しておき、位置変更はlayerの再配置で行うという方法。

例えば、PCのDesktopの背景はUIView(self.view)のdrawRectで起動時に一度だけ描画(setNeedsDisplay)をする。DesktopのアイコンはサブレイヤーのCALayer(layer)で管理(addSublayer:)をする。layerのdrawInContextでアイコンの絵面を描画(setNeedsDisplay)する。位置変更はlayoutSublayersで行うようにしておく。アイコンのサムネが変化した時にはUIView(self.view)のdrawRectを呼ぶのではなく、そのサブレイヤー(self.view.sublayersの中の特定した一つ)のレイヤーの再描画メソッド(setNeedsDisplay)を呼ぶという流れ。

 

 

コメント

個のコメント

Powered by Facebook Comments

 Posted by at 07:17

  5 Responses to “drawrectとsetneedsdisplayとlayerの描画の図解まとめ”

  1. 見てる: “drawrectとsetneedsdisplayとlayerの描画の図解まとめ” http://t.co/cRRsRr71WL

  2. 知らんこと多かったw drawrectとsetneedsdisplayとlayerの描画の図解まとめ
    http://t.co/CKRPv2FgKL

  3. drawrectとsetneedsdisplayとlayerの描画の図解まとめ – http://t.co/h90mx4pWmJ

  4. 5件のコメント https://t.co/YW3jhjM50A “drawrect_setneedsdisplay_layer” https://t.co/g2SQbLAQE6

  5. drawrectとsetneedsdisplayとlayerの描画の図解まとめ https://t.co/FRg8o6bdtO

Sorry, the comment form is closed at this time.