5

UIViewControllerのビューの正確なサイズを知ることができるのはいつですか?

問題

UILabelフレームがテキストと親ビューの幅に依存する複数行があります。他のビューをのに配置する必要があることを考えるとUILabel、そのフレームがテキストのスペースを正確にカバーするようにすることが重要です。

私は現在、次のようにサイズを計算していますviewDidLoad

labelSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(self.view.frame.size.width, MAX_HEIGHT)];

UIViewController問題は、をモーダルフォームシートまたはポップオーバーとして使用すると、親ビューの幅が変わることです。UILabelのフレームを使用autoresizingMaskすると、それに応じて調整されますが、テキストに完全に適合しなくなります。

UILabelビューの正確なサイズを知っているこのフレームはどこで計算できUIViewController'sますか?

デバッグの取り組み

UIViewControllerこれは、モーダルフォームシート()として表示するときにself.view.frameを印刷した結果ですUIModalPresentationFormSheet

viewDidLoad: (0.000000;0.000000;320.000000;480.000000)
viewWillAppear: (0.000000;0.000000;768.000000;960.000000)
afterDelay: (0.000000;0.000000;540.000000;576.000000)

上記の出力を生成するコード:

- (void)viewDidLoad {
    [super viewDidLoad];
    [Utils logFrame:self.view.frame tag:@"viewDidLoad"];
}

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [Utils logFrame:self.view.frame tag:@"viewWillAppear"];
    [self performSelector:@selector(afterDelay) withObject:nil afterDelay:0.1];
}

- (void) afterDelay {
    [Utils logFrame:self.view.frame tag:@"afterDelay"];
}
4

4 に答える 4

2

これは、UIViewControllerのルートビューがautoresizingMaskを使用しているためです。ルートビューの「layoutSubviews」メソッドをオーバーライドしない限り、UIViewControllerのルートビューのサイズを検出するための「完璧なタイミング」はないと思います。

ビューのサイズを自動的に変更したくない場合は、自動サイズ変更を使用せず、自分でサイズを設定してください。常に予想と同じサイズになります。

ルートビューが使用しているautoresizingMaskの種類がわからない場合は、NSLogが最適です。

于 2011-08-16T12:32:22.460 に答える
1

これはバグのように見えます。値はviewWillAppearで認識されている必要があります。

別の方法は、 UIViewをサブクラス化し、そこでlayoutSubviewsをオーバーライドして、コンテンツに基づいてサブビューを配置することです。[self.view setNeedsLayout]その後、ラベルの内容を更新するたびに、ViewControllerから呼び出す必要があります。ビューのサイズが変更された場合、システムはそれを呼び出すので、カバーする必要があります。

于 2011-08-16T10:55:36.103 に答える
0

ラベルサイズを見つけるためにこれを試してください、

labelSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(self.label.frame.size.width, MAX_HEIGHT)];

ビューの幅を使用する代わりに、コンストレイントサイズでラベルの幅を使用します。これは、ビューコントローラのviewDidLoad、viewDidApperメソッドで使用できる必要があります。

于 2011-08-16T10:07:57.563 に答える
0

viewWillAppearを試してください。ビューが表示される前にサイズがわからない理由はありません

于 2011-08-16T10:16:12.437 に答える