この質問の目的を明確にするために、サブビューと drawRect の両方を使用して複雑なビューを作成する方法を知っています。いつ、なぜどちらを使用するのかを完全に理解しようとしています。
また、プロファイリングを行う前に、それほど前もって最適化し、より難しい方法で何かを行うことは意味がないことも理解しています。私は両方の方法に満足しており、今はもっと深く理解したいと思っています。
私の混乱の多くは、テーブル ビューのスクロール パフォーマンスを非常にスムーズかつ高速にする方法を学んだことから生じています。もちろん、このメソッドの元のソースは、iPhone 用の twitter (以前のトゥイーティー) の背後にある作者からのものです。基本的に、テーブルのスクロールをバターのようにスムーズにする秘訣は、サブビューを使用せず、すべての描画を 1 つのカスタム uiview で行うことです。基本的に、多くのサブビューを使用するとレンダリングが遅くなるようです。これは、多くのオーバーヘッドがあり、親ビューで常に再合成されるためです。
公平を期すために、これは 3GS がかなり新しい時代に書かれたものであり、iDevices はそれ以来ずっと高速になっています。それでも、この方法は、インターウェブや他の場所で高性能テーブルのために定期的に 提案されています. 実際、これはApple の Table Sample Codeで提案されている方法であり、いくつかの WWDC ビデオ ( Practical Drawing for iOS Developers ) や多くの iOSプログラミング ブックで提案されています。
グラフィックスを設計し、それらの Core Graphics コードを生成するための見栄えの良いツールさえあります。
そのため、最初は「Core Graphics には理由があります。それは速いのです!」と信じるようになりました。
しかし、「可能な場合は Core Graphics を優先する」という考えを思いつくとすぐに、drawRect がアプリの応答性の低下の原因であることが多く、メモリに関して非常に高価であり、実際に CPU に負担をかけることがわかります。基本的に、「drawRect のオーバーライドを避ける」必要があります(WWDC 2012 iOS App Performance: Graphics and Animations )
だから私は、すべてのように、それは複雑だと思います. drawRect を使用するタイミングと理由を、自分自身や他の人が理解できるように手助けできるかもしれません。
Core Graphics を使用する明白な状況がいくつかあります。
- 動的データがある (Apple の株価チャートの例)
- 単純なサイズ変更可能な画像では実行できない柔軟な UI 要素がある
- 一度レンダリングされると複数の場所で使用される動的グラフィックを作成しています
Core Graphics を避けるべき状況が見られます。
- ビューのプロパティを個別にアニメーション化する必要があります
- ビューの階層が比較的小さいため、CG を使用して追加の作業を行っても、得られる価値はありません。
- 全体を再描画せずにビューの一部を更新したい
- 親ビューのサイズが変更されたときに、サブビューのレイアウトを更新する必要があります
だからあなたの知識を授けてください。どのような状況で drawRect/Core Graphics に到達しますか (サブビューでも実現できます)? その決断に至った要因は何ですか?バターのように滑らかなテーブル セルのスクロールのために 1 つのカスタム ビューでの描画が推奨されるのはなぜですか? 単純な背景画像についてはどうですか (CG で作成するのではなく、サイズ変更可能な png 画像を使用するのはいつですか)?
価値のあるアプリを作成するために、このテーマを深く理解する必要はないかもしれませんが、理由を説明できずにテクニックを選択するのは好きではありません。私の脳は私に怒っています。
質問の更新
みんな情報ありがとう。ここにいくつかの明確な質問があります:
- コア グラフィックスを使用して何かを描画しているが、UIImageViews と事前にレンダリングされた png を使用して同じことを達成できる場合、常にその方法を使用する必要がありますか?
- 同様の質問: 特にこのような悪いツールでは、いつコア グラフィックスにインターフェイス要素を描画することを検討する必要がありますか? (おそらく、要素の表示が可変の場合。たとえば、20 種類のカラー バリエーションを持つボタン。その他の場合は?)
- 以下の私の回答での私の理解を考えると、複雑な UIView レンダリング自体の後にセルのスナップショット ビットマップを効果的にキャプチャし、複雑なビューをスクロールして非表示にしながらそれを表示することで、テーブル セルの同じパフォーマンスの向上が得られる可能性がありますか? 明らかに、いくつかの部分を解決する必要があります。私が持っていたただの興味深い考え。