UIWindowがUViewの子であり、親でもあるのはなぜですか?
-
06-07-2019 - |
質問
UIKitリファレンスでは、UIViewはUIWindowのスーパークラスですが、この親子関係にもかかわらず、UIWindowは実際にUIViewを管理します。これは私にはとても異常に聞こえます。
これの重要性がソフトウェア設計の観点から何であるかを誰もが知っていますか?
どうもありがとう。
編集:
iPhoneプログラミングガイドの関連する段落を読みました。しかし、なぜそれらが逆になるのかわかりませんでした。UIWindowをUIViewの親にします。 Appleがこの方法でクラス階層を設計することを余儀なくされた何かがあったに違いありません。
解決
経験豊富なMac OS X開発者がUIWindowクラスに関して異例と感じることの1つは、その継承です。 Mac OS Xでは、NSWindowの親クラスはNSResponderです。 iPhone OSでは、UIWindowの親クラスはUIViewです。したがって、iPhone OSでは、ウィンドウはビューオブジェクトでもあります。親子関係にもかかわらず、通常、iPhone OSのウィンドウはMac OS Xの場合と同じように扱います。つまり、通常、UIWindowオブジェクトのビュー関連のプロパティを直接操作しません。
編集:
UIViewは一般的なものです(すべてのタイプのビューを作成し、それらのプロパティにアクセスするために使用する一般的なメソッドを提供します)。 / p>
私は少しあいまいであり、この階層の正確な理由を知っているのはリンゴだけだと思います。
UIWindowクラスは、アプリケーションが画面に表示するウィンドウを管理および調整するオブジェクト(windows)を定義します。ウィンドウの2つの主な機能は、ビューを表示する領域を提供することと、イベントをビューに配布することです。
UIViewクラスは、すべてのタイプのビューを作成し、それらのプロパティにアクセスするために使用する共通メソッドを提供します。たとえば、サブクラスに独自の初期化子が指定されていない限り、initWithFrame:メソッドを使用してビューを作成します。 frameプロパティは、スーパービュー座標でビューの原点とサイズを指定します。すべてのビューの座標系の原点は、左上隅にあります。
UIViewオブジェクトは、サブウィンドウのネストされた階層で、UIWindowオブジェクト内に配置されます。ビュー階層内の親オブジェクトはスーパービューと呼ばれ、子はサブビューと呼ばれます。ビューオブジェクトは、それを囲むスーパービューの長方形の領域を要求し、その領域内のすべての描画を担当し、その領域で発生するイベントを受け取る資格もあります。兄弟ビューは問題なくオーバーラップでき、複雑なビューの配置が可能です。
他のヒント
すべてのUIViewには、ウィンドウにのみ意味のある(継承された)プロパティと動作があるためです。それは間違っています。
他の方法はより意味があります。ウィンドウはビューの上に動作を追加します。そのため、描画したり、境界を設定したり、他のビューを含めたりすることができます。しかし、たとえば、ディスプレイにレンダリングする方法を知ることで、これを拡張します。
MacOS Xでは、NSWindowsはビューではありません。これらには、contentViewと呼ばれる「ルートビュー」が含まれています。 iOSウィンドウは、NSWindowとそのルートビューの組み合わせです。
メインウィンドウのルートビューを含む通常のUIViewにはそれぞれ、親ビューが必要です。 UIWindowはUIViewを継承して、ビュー階層内の親ビューの役割を実行します。 UIWindowは通常のビューではなく、UIViewのインターフェイスからのメソッドの独自の実装を持っています。