什么时候可以知道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"];
}
答案 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。在视图即将显示之前没有理由不知道大小