如何找出UIViewController视图的确切框架?

hpi*_*que 5 iphone viewdidload ipad ios autoresizingmask

什么时候可以知道UIViewController视图的确切大小?

问题

我有一个多行,UILabel其帧取决于其文本和父视图的宽度.考虑到我需要放置其他视图下面UILabel,它做它的框架盖文的准确的空间是很重要的.

我目前正在计算这样的大小viewDidLoad:

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

问题是当父视图UIViewController用作模态表单或弹出框时,父视图的宽度会发生变化.如果我使用autoresizingMaskUILabel的框架进行相应的调整,但它不再适合文本.

UILabel知道UIViewController's视图的确切大小,我在哪里可以计算出这个框架?

调试努力

这是在显示UIViewController模态表单(UIModalPresentationFormSheet)时打印self.view.frame的结果.

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)
Run Code Online (Sandbox Code Playgroud)

产生上述输出的代码:

- (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"];
}
Run Code Online (Sandbox Code Playgroud)

xuz*_*zhe 2

那是因为你的 UIViewController 的根视图正在使用 autoresizingMask。我不认为有一个“完美的时机”来检测 UIViewController 的根视图的大小,除非您重写根视图的“layoutSubviews”方法。

如果您不希望视图自动调整大小,请不要使用自动调整大小并自行设置大小,它将始终与您期望的大小相同。

如果您不确定您的根视图使用哪种 autoresizingMasks,NSLog 是您的朋友。