控制器父子关系建立的原则
- 如果2个控制器的view是父子关系(不管是直接还是间接的父子关系),那么这两个控制器也应该为父子关系
[a.view addSubView: b.view];
[a addChildViewController: b];
- 间接的添加
a的view上添加OtherView ,otherView上添加b控制器 也应该遵循父子关系原则
[a.view addSubView :OtherView];
[OtherView addSubView: b.view];
[a addChildViewController: b];
- 如果不建立父子关系的后果会怎样?
- 如果出现横竖屏需求等子控制器不会接收到信息
- 2.控制器的一些方法子控制器无响应
获得所有的子控制器
@property(nonatomic,readonly) NSArray *childViewControllers;
添加一个子控制器
//OneViewController成为了self的子控制器
//self成为了OneViewController的父控制器
[self addChildViewController:[[OneViewController alloc] init]];
// 通过addChildViewController添加的控制器都会存在于childViewControllers数组中
获得父控制器
@property(nonatomic,readonly) UIViewController *parentViewController;
将一个控制器从它的父控制器中移除
// 控制器a从它的父控制器中移除
[a removeFromParentViewController ];
// 当一个控制器从父控制器中移除时。会自动调用控制器的didMoveToParentViewController:方法,并且参数是nil
[self.childViewControllers[0] removeFromParentViewController];
didMoveToParentViewController
- (void)willMoveToParentViewController:(UIViewController *)parent
- 当一个视图控制器从视图控制器容器中被添加或者被删除之前,该方法被调用
- parent:父视图控制器,如果没有父视图控制器,将为nil
注意点:
- 1.当我们向我们的视图控制器容器中调用removeFromParentViewController方法时,必须要先调用该方法,且parent参数为nil:
[将要删除的视图控制器 willMoveToParentViewController:nil]; - 2.当我们调用addChildViewController方法时,在添加子视图控制器之前将自动调用该方法。所以,就不需要我们显示调用了。
过渡动画
- 添加一个中间层的view,做动画效果避免 全屏的动画
CATransition *animation = [CATransition animation];
animation.type = @"cube";
animation.subtype = index > oldIndex ? kCATransitionFromRight : kCATransitionFromLeft;
animation.duration = 0.5;
[self.contentView.layer addAnimation:animation forKey:nil];
autoresizingMask
- 默认情况下,所有控制器的view的autoresingMask属性都包含了
UIViewAutoresizingFlexibleWidth
和UIViewAutoresizingFlexibleHeight
两个值
// self.view == 600x600 --> 375x667
// one.view == 100x100 --> 缩小x增大
a.view.autoresizingMask = UIViewAutoresizingNone;