一、简单介绍
除了push之外,还有另外一种控制器的切换方式,那就是Modal
任何控制器都能通过Modal的形式展⽰出来
Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为⽌
二、代码实现
1.在当前控制器中写弹出modal窗口的代码
- (IBAction)jump2two:(UIButton *)sender {
//创建一个新的modal并弹出
YYtwoViewController *two=[[YYtwoViewController alloc]init];
//在two上用导航控制器包装,让弹出的模态窗口有一个导航栏可以放返回按钮 UINavigationController *nvc=[[UINavigationController alloc]initWithRootViewController:two];
[self presentViewController:nvc animated:YES completion:^{
NSLog(@"弹出一个模态窗口");
}];
}
2.使模态窗口消失要在弹出的模态窗口的控制器中写以下代码
-(void)change{
//如果一个控制器是以模态的形式展现出来的, 可以调用该控制器以及该控制器的子控制器让控制器消失
[self dismissViewControllerAnimated:YES completion:^{
NSLog(@"移除");
}];
}
三、何时使用
在实际的开发中,如果控制器之间的关系紧密一般用导航控制器,如果控制器之间的关系不是很紧密就用modal
四、内部机制
(1)弹出之后,window上面只有一个子视图。
(2)虽然当前界面上展示在我们眼前的时twoview,但是window的根控制器仍然是NJviewController,它并没有切换window的根控制器,而仅仅只是换了window上面显示的视图。
(3)移除的视图并没有销毁,因为控制器并没有销毁,所以控制器对应的view也没有销毁。
(4)在模态弹出(完全显示后),在方法中传入two作为参数,默认就有一个控制器强引用着它。
(5)当向下移除之后,只要调用了控制器的dismiss方法让窗口关闭,modal就释放了。
(6)通常弹出的模态窗口都会提供一个导航条,让界面拥有导航条的最快的方式是给它包装一个导航控制器。
(7)如果一个控制器是以模态的形式展现出来的。可以调用该控制器以及该控制器的子控制器,让该控制器消失。
五、一开始就介绍了,模态窗口默认是从下向上弹出的。其实模态窗口还有其他的弹出方式
直接上代码:
SecondViewController*second = [[SecondViewControlleralloc]init];
second.view.backgroundColor= [UIColorredColor];
/**
modal 的控制的的 view 的尺寸
UIModalPresentationFullScreen = 0, // - 满屏
UIModalPresentationPageSheet NS_ENUM_AVAILABLE_IOS(3_2),// - 弹出的菜单
UIModalPresentationFormSheet NS_ENUM_AVAILABLE_IOS(3_2),- 弹出的菜单
*/
//只针对iPad,对iPhone不适用
second.modalPresentationStyle=UIModalPresentationFormSheet;
/**
modal 控制的的动画样式
UIModalTransitionStyleCoverVertical = 0,
UIModalTransitionStyleFlipHorizontal,//翻转
UIModalTransitionStyleCrossDissolve,//淡入淡出
UIModalTransitionStylePartialCurl // - 翻页
*/
second.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal;
[self presentViewController:second animated:YES completion:nil];
五、其他
UIModalPresentationOverFullScreen NS_ENUM_AVAILABLE_IOS(8_0),//原来的不隐藏
UIModalPresentationOverCurrentContext NS_ENUM_AVAILABLE_IOS(8_0)//原来的不隐藏
UIViewController的modalPresentationStyle的上面两个值是可以让原来的控制器view不消失,保持在弹出的控制器的下面,可以用来实现酷狗音乐的转场动画。
网友评论
viewControler.view.center = CGPointMake(self.view.bounds.size.width + self.view.center.x, self.view.center.y);
[self.view addSubview:viewControler.view];
[self addChildViewController:viewControler];//self持有viewController
[UIView animateWithDuration:0.5 animations:^{
viewControler.view.center = self.view.center;
} completion:^(BOOL finished) {
if (finished) {
NSLog(@"动画执行完毕");
}
}];
}
- (void)customDismiss{
[UIView animateWithDuration:0.5 animations:^{
self.view.center = CGPointMake(self.view.bounds.size.width + self.view.center.x ,self.view.center.y);
} completion:^(BOOL finished) {
if (finished) {
[self.view removeFromSuperview];
[self removeFromParentViewController];
}
}];
}
这个方法可以自定义类似于从上到下的弹出