为啥在 viewDidLoad 中添加子视图不起作用

Posted

技术标签:

【中文标题】为啥在 viewDidLoad 中添加子视图不起作用【英文标题】:Why does adding subview in viewDidLoad doesn't work为什么在 viewDidLoad 中添加子视图不起作用 【发布时间】:2014-05-17 11:04:08 【问题描述】:

我试图将 UIToolBar 添加到 UIWebView 中,但是每当我在 viewDidLoad 中插入此代码时,UIToolBar 都不会显示,但是当在 viewWillAppear 中完成此操作时,它可以工作。谁能给我解释一下。

-(void)viewDidLoad

[super viewDidLoad];
self.forwardButton = [[UIBarButtonItem alloc]initWithTitle:@"Forward"          style:UIBarButtonItemStylePlain target:self action:@selector(forward)];
self.backButton = [[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(back)];
NSArray *buttonsArray = @[self.backButton,self.forwardButton];
CGRect toolBarFrame = CGRectMake(0, self.view.frame.size.height - 44, self.view.frame.size.width, 44);
self.toolbar = [[UIToolbar alloc]initWithFrame:toolBarFrame];
[self.toolbar setItems:buttonsArray animated:YES];
[self.toolbar sizeToFit];
[self.view addSubview:self.toolbar];

【问题讨论】:

对我来说似乎是故事板,但无论如何...要澄清问题,请检查类似问题:Unable to set frame correctly before viewDidAppear 或 UIViewController returns invalid frame? 【参考方案1】:

viewDidLoad 中添加子视图,但在viewWillAppear 中设置其frameself.view.frame 是在 UIKit 调用 viewWillAppear 之前设置的。您在viewDidLoad 中获得的值是在 nib 中设置的值,并且通常与实际的 frame 不同。

别忘了设置autoresizingMask 或使用自动布局。

【讨论】:

那么边界是在框架之前设置的吗? UIKit 在viewWillAppear: 之前设置了正确的尺寸,这意味着将设置frameboundscenter。所有这些属性都由对应的CALayer 的相同属性支持,因此,除非设置了transform,否则您应该期望framebounds 在“正确性”方面具有相似的行为。希望这是有道理的。

以上是关于为啥在 viewDidLoad 中添加子视图不起作用的主要内容,如果未能解决你的问题,请参考以下文章

添加注释以从另一个视图映射

在 viewDidLoad 中添加子视图有奇怪的行为 [重复]

即使 contentSize 大于 frame 并且在设置内容大小之前添加了子视图,滚动视图也不起作用

为啥我的 UIView 的 UILabel 子视图不显示?

为啥这些约束不起作用?

ios中给uiscrollview添加的全屏子视图为啥宽度只显示屏幕的一半