10

UIViewController init/viewDidLoad メソッドのフレーム サイズを信頼できないことは誰もが知っています。これ:

- (void)viewDidLoad: {
     NSLog(@"%d", self.view.frame.size.width);
}

多くの場合、間違ったサイズで印刷されます (特に、ランドスケープ モードではかなり壊れます)。

これは実際には常に正しい結果を返すため、サブビューをレイアウトすることをお勧めします。

- (void)viewWillAppear: {
     NSLog(@"%d", self.view.frame.size.width);
}

問題は、ビューが表示されるたびに viewWillAppears が呼び出されるため、サブビューの割り当てまたは追加には適していないことです。そのため、インターフェース内のすべてのビューを宣言する ことになり、ほとんどのアイテムは初期設定後にそれ以上操作する必要がないため、私がまったく好きではない巨大なヘッダー ファイルになってしまいます。

質問 1 は、サブビューの配置を処理するためのより良い方法はありますか?

質問 2 は非常に関連しています。たとえば、他のさまざまなサブビューを含む UIView のサブクラスがあるとします。インターフェイス内で宣言し、init/viewDidLoad メソッドで割り当て/初期化します。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    ...
    menu = [[SNKSlidingMenu alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    ...
}

すでにわかっているように、より正確な読み取りを行うには、viewWillAppear で再配置する必要があります。

- (void)viewWillAppear:(BOOL)animated{
    ....
    menu.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    ....
 }

問題は、もちろんすべてのサブビューも再配置する必要があることです。これは、自動的に呼び出される layoutSubviews 関数によって行われますが、同じ問題が発生しました。すべてのサブビューを SNKSlidingMenu クラスのインターフェイス内で宣言する必要があります。これを回避する方法はありますか?

ありがとう。

4

4 に答える 4