なぜ をサブクラス化し、呼び出されるメソッドUIView
を実装するのかと最初は疑問に思いましdrawRect
たが、同時に、このビューにボタンやラベルを追加し、それらの位置座標を調整すると、それらも再描画されます.. . したがって、このビューの描画には 2 つのメカニズムがあるようです。1 つはそれ自体のため、もう 1 つはこのビュー内のオブジェクトのためです。
しかし、1/60 秒ごとにツリー全体がトラバースされているようです。トップ ビュー オブジェクトから開始して、iOS はすべての子を訪問し、次に を呼び出します。また、孫が訪問さdrawRect
れるself
のと同じ方法で子も訪問され、次のようにdrawRect
、それらの第 1 レベルの子ごとに呼び出されます。
-(void) processViewObject:(UIView *) obj {
// pseudo code:
foreach children "c" already sorted by zOrder from most negative to -1
processViewObject(c) // recursion
if ([self needsUpdateOrNot] == YES)
[self drawRect]
foreach children "c" already sorted by zOrder from 1 to the greatest number
processViewObject(c) // recursion
}
呼び出しは 1/60 秒ごとに行われます。
processViewObject(topViewObject); // start from the topmost view object
任意のビューがdrawRect
およびビューの子で自分自身を描画できるように、それらの位置座標のいずれかが変更された場合、またはそれらのコンテンツが変更された場合、ダーティ ビットneedsUpdateOrNot
が以前に設定されているため、自分drawRect
自身を再描画するために呼び出されます。
または、実際には、ビューのダーティ ビットが設定されている場合、次のように、おそらくこのビットが再帰で子に渡されます。
foreach children "c" already sorted by zOrder from 1 to the greatest number
processViewObject(c, [self needsUpdateOrNot])
親のダーティ ビットが設定されている場合、このビュー内の画像全体を正しく描画するには、子も再描画する必要があります。
また、見栄えの良いボタンやラベルのそれぞれは、ボタン、チェックボックス、ラベル、その他のウィジェットなど、見栄えの良い画像を描画できる が既に実装されている単なるUIView
オブジェクトです。drawRect
これが、すべてが画面上に描画される全体的なメカニズムですか? 「自分自身を呼ばないで、呼ばせて」と聞くがdrawRect
、その理由はよく分からないが、上記が全体の仕組みだとすると、それが理由のようだ。
これは実際には Microsoft Windows や他の GUI オペレーティング システムとほぼ同じメカニズムなのだろうか、いくつかのゲーム フレームワークでは、ダーティ ビットが設定されているかどうかに関係なく、すべてが描画されると思います。ゲームでは常に動きますが、フレームワークはとにかく 1/60 秒ごとにそれらすべてを描画します。
上記のzOrder
処理順序は、いくつかのフレームワークのコードにあったため、すべての負の zOrder 子が最初に描画され、次にself
描画され、次にすべての正の zOrder 子が描画されます。(これは、画面上にオブジェクトをペイントするペインター モデルの方法で zOrder が達成される方法です。後者の描画は、前に描画されたものを覆い隠します。)子に対する ifself
の zOrder も0
同様です -- 問題の zOrder 数self
ifそれは自分の兄弟に対して相対的であり、その子供に対してではありません。
上記は正確ですか?回答を提供する場合、可能であれば、ソース コードまたは参照の一部を引用して、それがどのように機能するかの標準または公式の方法であることを確認できますか?