我正在编写一个自定义容器控制器,以编程方式实例化一个子视图控制器和几个视图。此外,子视图控制器以编程方式实例化一个视图,然后我用addSubview手动将其添加到容器的视图层次结构中。
我的问题是在我的容器控制器的代码我实例化我的子视图控制器和直接由容器控制器控制的视图?
我知道loadView是你应该在编程时创建视图层次结构的地方,但我需要将子控制器的视图添加到视图层次结构中。由于子控制器的视图是在创建子控制器时实例化的,这意味着我需要首先创建子控制器。那么我是否要在loadView中创建子控制器然后将其视图添加到视图层次结构中呢?这似乎不对。
现在我一直在viewDidLoad创建子视图控制器,然后将其视图添加到视图层次结构中,这是有效的,但我已经阅读了整个层次结构应该在loadView中构建。正确的处理方式是什么?
试试这个方法:
在加载视图中按如下方式设置一些容器:
(本例在主内容下创建导航菜单,您可以滑动显示它)。
- (void)loadView
{
CGRect fullScreen = [UIScreen mainScreen].bounds;
CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;
self.view = [[UIView alloc] initWithFrame:CGRectMake(0, statusBarFrame.size.height, fullScreen.size.width,
fullScreen.size.height - statusBarFrame.size.height)];
[self.view setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth];
_mainNavigationContainer =
[[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width - 60, self.view.frame.size.height)];
[_mainNavigationContainer setHidden:YES];
[self.view addSubview:_mainNavigationContainer];
_mainContentViewContainer = [[GGMainContentContainer alloc] initWithFrame:self.view.bounds];
[_mainContentViewContainer setNavigationDelegate:self];
[self.view addSubview:_mainContentViewContainer];
}
完成后,创建一个方法来接受子控制器
- 你应该把子控制器的视图放到合适的容器中,把视图的框架设置为容器的边界。
- 你应该有你的容器视图控制器,保留子控制器在其使用期间。
- (void)setMainNavigationController:(UIViewController*)mainNavigationController
{
_mainNavigationController = mainNavigationController;
[_mainNavigationController.view setFrame:_mainNavigationContainer.bounds];
[_mainNavigationController willMoveToParentViewController:self];
[_mainNavigationContainer addSubview:_mainNavigationController.view];
[_mainNavigationController didMoveToParentViewController:self];
}
下面是一个在运行时动画化主容器的例子
- (void)pushViewController:(UIViewController*)viewController replaceRoot:(BOOL)replaceRoot
{
if ([_controllerStack peek] == nil)
{
[_controllerStack push:viewController];
[_mainContentViewContainer setContent:viewController.view navigationBarOrNil:[self makeNavigationBarForTopController]];
}
else
{
if (replaceRoot)
{
[_controllerStack removeAllObjects];
}
[self slideToViewController:viewController direction:GGSlideAnimationDirectionFromRight];
}
}
这里有一些幻灯片和一个示例可能会有所帮助:
https://speakerdeck.com/peterfriese/ios-5-uiviewcontroller-containment