我有故事板:
正如您所看到的,我有 MenuViewController:UIViewController 和容器。容器是 MenuTableViewController:UITableViewController 使用 MenuTableView:UITableView 。
我想要做的是更改Container的大小(MenuTableViewController)并将另一个Child添加到我的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)。但可能永远不会出现。这是截图:
答案 0 :(得分: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
更简单地获取对故事板的引用答案 1 :(得分:2)
我同意rdelmar关于程序化自定义容器调用。
我还注意到您正在使用自动布局(仅限iOS 6+),因此您不能再仅仅更改frame
视图。你真的应该修改约束。你需要自动布局吗?如果没有,请将其关闭。如果您想支持6.0之前的iOS版本,那么有关闭它。
如果继续使用autolayout,则应为适当的约束创建IBOutlet
,然后使用该约束的常量来更改布局。非常容易以这种方式更改UIView
控件尺寸。
更进一步,以编程方式将视图添加到自动布局场景可能是让所有约束正确的麻烦。坦率地说,我认为从场景中将两个容器放在场景上(每个子视图一个)要容易得多,但是基本上通过将其宽度设置为零来隐藏一个容器。您可以有效地设置它们的约束(在VFL中描述它)@"|[container1][container2]|"
,然后将隐藏的宽度设置为零。然后,当您想要显示隐藏容器时,将其宽度约束的常量设置为您想要的任何值。当你这样做时,它会自动调整两个容器的大小。