添加 childViewController 不包括背景颜色等基本设置
Adding childViewController does not include basic settings like background color
背景:我正在按照 Apple 关于制作 iMessage 应用程序的示例,我将向 MSMessagesAppViewController
.
展示一个 childViewController
(子类 UIViewController
)
我做的每件事都尽可能基本。在我的 childViewController
中,这就是我在 viewWillAppear
中所做的
//ChildViewController.m
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.view.backgroundColor = [UIColor blueColor]; //! this does not show
UILabel *middleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
middleLabel.text = @"this is the childView"; //! however, this shows up
middleLabel.center = CGPointMake(self.view.center.x, self.view.frame.size.height*0.20);
[self.view addSubview:middleLabel];
}
然后在我的 MSMessagesAppViewController
中,这就是我在 willBecomeActiveWithConversation
中所做的(与 viewWillAppear
基本相同)
- (void)willBecomeActiveWithConversation:(MSConversation *)conversation
{
[super willBecomeActiveWithConversation:conversation];
UIViewController *viewController;
viewController = [[UIStoryboard storyboardWithName:@"MainInterface" bundle:nil] instantiateViewControllerWithIdentifier:@"childViewController"];
[self addChildViewController:viewController];
viewController.view.frame = self.view.bounds;
viewController.view.translatesAutoresizingMaskIntoConstraints = NO;
viewController.view.center = self.view.center;
[self.view addSubview:viewController.view];
[viewController didMoveToParentViewController:self];
}
如您所见,没什么特别的,但我 运行 的问题是背景 不会变成黄色 ,尽管我在 childViewController 中设置了它.
编辑
其他测试表明 ChildViewController
中的手势识别器也以某种方式被禁用,UIButton
s 也是如此。
对于那些好奇的人,源代码在 Github 上。
将您的代码替换为:
- (void)willBecomeActiveWithConversation:(MSConversation *)conversation
{
[super willBecomeActiveWithConversation:conversation];
UIViewController *viewController;
viewController = [[UIStoryboard storyboardWithName:@"MainInterface" bundle:nil] instantiateViewControllerWithIdentifier:@"childViewController"];
[self addChildViewController:viewController];
viewController.view.frame = self.view.bounds;
viewController.view.translatesAutoresizingMaskIntoConstraints = NO;
viewController.view.center = self.view.center;
viewController.view = [UIColor yellowColor];
[self.view addSubview:viewController.view];
[viewController didMoveToParentViewController:self];
}
把这一行:[self addChildViewController:viewController];
之前:[viewController didMoveToParentViewController:self];
viewController.view.frame 可能是错误的或为零,并且显示标签是因为它的大小是绝对的并且它已经溢出了超级视图。
这里的关键原因是下面的代码:
viewController.view.frame = self.view.bounds;
viewController.view.translatesAutoresizingMaskIntoConstraints = NO;
viewController.view.center = self.view.center;
由于某些原因,它是不正确的。
self.view
的范围会变,不会一直是之前的self.view.bounds
。您的 childViewController 的视图框架将不会是 self.view.bounds
.
因为1不正确,所以viewController.view.translatesAutoresizingMaskIntoConstraints = NO;
和viewController.view.center = self.view.center;
会让事情变得更糟。你的子view controller的view不会在你想的那个位置。
如果你不明白,你可以试试删除viewController.view.translatesAutoresizingMaskIntoConstraints = NO;
和viewController.view.center = self.view.center;
并设置一些其他框架为viewController.view.frame
来测试它。
禁用手势识别器的原因与您设置错误的框架的原因相同。
无用代码:
viewController.view.center = self.view.center;
如果viewController.view.frame == self.view.bounds
,设他们的中心相等是没有用的。 CGRect实际确定一个位置的中心。
解决方案:
使用自动布局设置 viewController.view
的位置或获取视图框架的实际框架。
背景:我正在按照 Apple 关于制作 iMessage 应用程序的示例,我将向 MSMessagesAppViewController
.
childViewController
(子类 UIViewController
)
我做的每件事都尽可能基本。在我的 childViewController
中,这就是我在 viewWillAppear
//ChildViewController.m
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.view.backgroundColor = [UIColor blueColor]; //! this does not show
UILabel *middleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
middleLabel.text = @"this is the childView"; //! however, this shows up
middleLabel.center = CGPointMake(self.view.center.x, self.view.frame.size.height*0.20);
[self.view addSubview:middleLabel];
}
然后在我的 MSMessagesAppViewController
中,这就是我在 willBecomeActiveWithConversation
中所做的(与 viewWillAppear
基本相同)
- (void)willBecomeActiveWithConversation:(MSConversation *)conversation
{
[super willBecomeActiveWithConversation:conversation];
UIViewController *viewController;
viewController = [[UIStoryboard storyboardWithName:@"MainInterface" bundle:nil] instantiateViewControllerWithIdentifier:@"childViewController"];
[self addChildViewController:viewController];
viewController.view.frame = self.view.bounds;
viewController.view.translatesAutoresizingMaskIntoConstraints = NO;
viewController.view.center = self.view.center;
[self.view addSubview:viewController.view];
[viewController didMoveToParentViewController:self];
}
如您所见,没什么特别的,但我 运行 的问题是背景 不会变成黄色 ,尽管我在 childViewController 中设置了它.
编辑
其他测试表明 ChildViewController
中的手势识别器也以某种方式被禁用,UIButton
s 也是如此。
对于那些好奇的人,源代码在 Github 上。
将您的代码替换为:
- (void)willBecomeActiveWithConversation:(MSConversation *)conversation
{
[super willBecomeActiveWithConversation:conversation];
UIViewController *viewController;
viewController = [[UIStoryboard storyboardWithName:@"MainInterface" bundle:nil] instantiateViewControllerWithIdentifier:@"childViewController"];
[self addChildViewController:viewController];
viewController.view.frame = self.view.bounds;
viewController.view.translatesAutoresizingMaskIntoConstraints = NO;
viewController.view.center = self.view.center;
viewController.view = [UIColor yellowColor];
[self.view addSubview:viewController.view];
[viewController didMoveToParentViewController:self];
}
把这一行:[self addChildViewController:viewController];
之前:[viewController didMoveToParentViewController:self];
viewController.view.frame 可能是错误的或为零,并且显示标签是因为它的大小是绝对的并且它已经溢出了超级视图。
这里的关键原因是下面的代码:
viewController.view.frame = self.view.bounds;
viewController.view.translatesAutoresizingMaskIntoConstraints = NO;
viewController.view.center = self.view.center;
由于某些原因,它是不正确的。
self.view
的范围会变,不会一直是之前的self.view.bounds
。您的 childViewController 的视图框架将不会是self.view.bounds
.因为1不正确,所以
viewController.view.translatesAutoresizingMaskIntoConstraints = NO;
和viewController.view.center = self.view.center;
会让事情变得更糟。你的子view controller的view不会在你想的那个位置。如果你不明白,你可以试试删除
viewController.view.translatesAutoresizingMaskIntoConstraints = NO;
和viewController.view.center = self.view.center;
并设置一些其他框架为viewController.view.frame
来测试它。禁用手势识别器的原因与您设置错误的框架的原因相同。
无用代码:
viewController.view.center = self.view.center;
如果viewController.view.frame == self.view.bounds
,设他们的中心相等是没有用的。 CGRect实际确定一个位置的中心。
解决方案:
使用自动布局设置 viewController.view
的位置或获取视图框架的实际框架。