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

时间:2011-08-16 10:00:22

标签: iphone ios ipad viewdidload autoresizingmask

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

问题

我有一个多行UILabel,其框架取决于其文本和父视图的宽度。鉴于我需要在UILabel下方定位其他视图 ,所以重要的是使其框架完全覆盖文本的空间。

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

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

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

在哪里可以计算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)

产生上述输出的代码:

- (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 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

这看起来像一个bug,应该在viewWillAppear中知道该值。

另一种方法是将 UIView 子类化并覆盖layoutSubviews,以根据内容排列子视图。每次更新标签的内容时,您都必须从视图控制器中调用[self.view setNeedsLayout]。如果视图调整大小,系统将调用它,因此应该覆盖您。

答案 2 :(得分:0)

尝试使用此方法查找标签尺寸

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

不使用视图的宽度,而是使用约束大小中的标签宽度。这应该在视图控制器的viewDidLoad,viewDidApper方法中可用。

答案 3 :(得分:0)

尝试viewWillAppear。在视图即将显示之前没有理由不知道大小