5

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

问题

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

我目前计算这样的大小viewDidLoad

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

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

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

调试工作

这是将 self.view.frame 显示UIViewController为模态表单 ( 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。我不认为有一个“完美的时机”来检测你的 UIViewController 的根视图的大小,除非你覆盖你的根视图的 'layoutSubviews' 方法。

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

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

于 2011-08-16T12:32:22.460 回答
1

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

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

于 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 回答