1

他のスタック オーバーフローの質問から、View Controller では、viewDidLoadメソッドを使用してサブビューを初期化し、viewWillLayoutSubviewsメソッドを使用してフレームを設定できることを理解しています。これは、View Controller インスタンス内のすべてのビューの参照を保持する必要があることを意味します (以下を参照)。これはすべてうまくいき、デバイスの回転などを処理します.

UILabel* myLabel;

- (void)viewDidLoad
{
    myLabel = [[UILabel alloc] init];
    [myLabel setText:@"Hello"];
}

- (void)viewWillLayoutSubviews
{
    [myLabel setFrame:CGRectMake(0, 0, self.view.frame.size.width, 21)];
}

私の質問は、サブビューの複雑な階層がある場合はどうなるかということです。たとえば、UIView であるサブビューがあり、その UIView にサブビューを追加するとどうなるでしょうか (さらに深くなる可能性もあります)。viewWillLayoutSubviewsで各ビューのフレームを変更できるように、このビュー階層全体のすべてのビューへの参照を保持する必要がありますか? これが唯一の方法のようです。フレームを頻繁に変更する必要がないようにするには、コンストレイントが最善の方法ですか? この階層の管理をより管理しやすく、各カスタム ビュー内で自己完結型にするために、大量のカスタム UIView を構築するための最良の答えはありますか?

うまくいけば、これは十分に明確な質問です..事前に感謝します.

4

2 に答える 2

1

ロジックの一部を区分化し、コンポーネントを再利用する場合は、子ビュー コントローラーを使用することも検討する価値があります。

于 2013-10-19T04:14:03.957 に答える
1

レイアウトの制約を変更する可能性のある方法でビューまたはサブビューを操作するときはいつでも、呼び出す必要があります

[view layoutSubviews];

これにより、新しいプロパティ設定で制約が再作成されます。viewController が読み込まれると、フレームまたは境界を処理しないすべてのプロパティを設定し、viewWillLayoutSubviews でビューのフレームを設定します。これにより、すべての制約が作成され、それらが確実に満たされるようになります。

使用するストーリーボードに配置するオブジェクトには、そのオブジェクトへの参照を保持するプロパティが必要です。これは、特にテスト駆動開発のルールに従っている場合に、優れたコーディング プラクティスです。

質問に答えるために、ストーリーボードで複雑な階層を作成する場合、制約が適切である限り、すべて問題ありません。コードで作成する場合は、addSubview を呼び出すたびに必ず layoutSubviews を呼び出すようにしてください 例:

UIView* view1 = [[UIView alloc] initWithFrame:CGRectZero];
UIView* view2 = [[UIView alloc] initWithFrame:CGRectZero];
[view1 addSubview:view2];
[view1 layoutSubviews];

ビューが増えても構造が良くなるわけではありませんが、100 個のサブビューがある場合は... 本当のことです..何かを別のビューに分類する必要があります..

制約を使用すると、ビューのフレームを完全に定義できます。最初は違いに気付かないかもしれませんが、Autoresizing Mask と比較すると違いがわかります。また、違いを露骨に示すガイドもあります。

LayoutConstraints と Autolayout

于 2013-10-18T18:31:36.700 に答える