2

我有故事板: 我的故事板

如您所见,我有MenuViewController :带有容器的 UIViewController。容器是 MenuTableViewController : UITableViewControllerMenuTableView : UITableView

我想要做的是改变我的容器(MenuTableViewController)的大小并将另一个孩子添加到我的 mainVC 中。

我将它添加到 MenuViewController 中:

-(void)viewDidAppear:(BOOL)animated {

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
    MenuTableViewController* secondChildVC = [sb instantiateViewControllerWithIdentifier:@"MenuTableViewController"];
    [secondChildVC.view setBackgroundColor:[UIColor redColor]];
    [self addChildViewController:secondChildVC];
    NSLog(@"MenuTableViewController.view info: %@",secondChildVC.view);
    NSLog(@"secondChildVC views: %@",[secondChildVC.view subviews]);

    MenuTableViewController *firstChildVC = [self.childViewControllers objectAtIndex:0];
    [firstChildVC.view setFrame:CGRectMake(160, 0, 160, 504)];
    [firstChildVC.view setBackgroundColor:[UIColor greenColor]];
    NSLog(@"firstChildVC views: %@",[firstChildVC.view subviews]);

}

这是我的日志:

MenuTableViewController.view info: <MenuTableView: 0x8910e00; baseClass = UITableView; frame = (0 20; 320 548); clipsToBounds = YES; opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x761eca0>; layer = <CALayer: 0x76202b0>; contentOffset: {0, 0}>
2013-05-03 17:20:10.796 TestStories[41780:c07] secondChildVC views: (
    "<UIImageView: 0x76205e0; frame = (0 541; 320 7); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x7620680>>",
    "<UIImageView: 0x7620740; frame = (313 517; 7 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x76207e0>>"
)
2013-05-03 17:20:10.798 TestStories[41780:c07] firstChildVC views: (
    "<UITableViewCell: 0x7143110; frame = (0 320; 160 320); autoresize = W; layer = <CALayer: 0x713cc10>>",
    "<UITableViewCell: 0x7140b90; frame = (0 0; 160 320); autoresize = W; layer = <CALayer: 0x7140ce0>>",
    "<UIImageView: 0x7135000; frame = (0 497; 320 7); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x71351b0>>",
    "<UIImageView: 0x7135270; frame = (153 517; 7 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x7135310>>"
)

为什么我的 secondChildVC 不包含 TableViewCells?不知道。

您可以看到我使用红色和绿色作为背景(红色表示 secondChildCV)。但可能永远不会出现。这是屏幕截图: 在此处输入图像描述

4

2 回答 2

12

我认为你做错了几件事。子视图控制器将与容器视图的大小相同,因此您应该有一个 IBOutlet 到容器视图,并更改其大小,而不是更改子视图控制器的大小。

对于第二个孩子,您将其添加为孩子,但您从未将其视图添加到 MenuViewController 的视图中。您还应该在将其添加为子项后立即调用 didMoveToParentViewController。因此,您需要执行以下操作:

    MenuTableViewController* secondChildVC = [self.storyboard instantiateViewControllerWithIdentifier:@"MenuTableViewController"];
   [secondChildVC.view setBackgroundColor:[UIColor redColor]];
   [self addChildViewController:secondChildVC];
   [secondChildVC didMoveToParentViewController:self];
   secondChildVC.view.frame = CGRectMake(0,0,160,504);
   [self.view addSubview:secondChildVC.view];

另请注意,您可以更简单地使用 self.storyboard 获得对故事板的引用

于 2013-05-03T15:41:48.620 回答
2

我同意 rdelmar 关于程序化自定义容器调用的观点。

我还观察到您正在使用自动布局(仅限 iOS 6+),因此您不能再更改frame视图。你真的应该修改约束。你需要自动布局吗?如果没有,请将其关闭。如果要支持 6.0 之前的 iOS 版本,则必须将其关闭。

如果您继续使用自动布局,您应该IBOutlet为适当的约束创建,然后使用该约束的常量来更改布局。UIView以这种方式更改控制尺寸非常容易。

更进一步,以编程方式将视图添加到自动布局场景可能会很麻烦,无法正确设置所有约束。坦率地说,我认为从一开始就在场景中放置两个容器(每个子视图一个)要容易得多,但基本上通过将其宽度设置为零来隐藏一个。您可以将它们的约束设置为有效地(在 VFL 中描述)@"|[container1][container2]|",然后将隐藏的宽度设置为零。然后,当您想显示隐藏的容器时,将其宽度约束的常量设置为您想要的任何值。当你这样做时,这将自动调整两个容器的大小。

于 2013-05-03T15:53:33.850 回答