添加 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 中的手势识别器也以某种方式被禁用,UIButtons 也是如此。

对于那些好奇的人,源代码在 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;

由于某些原因,它是不正确的。

  1. self.view的范围会变,不会一直是之前的self.view.bounds。您的 childViewController 的视图框架将不会是 self.view.bounds.

  2. 因为1不正确,所以viewController.view.translatesAutoresizingMaskIntoConstraints = NO;viewController.view.center = self.view.center;会让事情变得更糟。你的子view controller的view不会在你想的那个位置。

  3. 如果你不明白,你可以试试删除viewController.view.translatesAutoresizingMaskIntoConstraints = NO;viewController.view.center = self.view.center;并设置一些其他框架为viewController.view.frame来测试它。

  4. 禁用手势识别器的原因与您设置错误的框架的原因相同。

无用代码:

viewController.view.center = self.view.center;

如果viewController.view.frame == self.view.bounds,设他们的中心相等是没有用的。 CGRect实际确定一个位置的中心。

解决方案:

使用自动布局设置 viewController.view 的位置或获取视图框架的实际框架。