概念
ios开发中,在当前视图上再弹出一个视图(模态视图)例如登陆视图,分享视图,注册等等。
说明
实现一个简单的多视图应用,视图控制器都会有一个presentViewController方法,用来显示模态窗口,在一些特别的环境下我们尤其愿意使用这种窗口,例如临时呈现一些内容时(登录视图、分享列表视图等),所以今天在这里做一下整理。
一、具体设置和使用
1、弹出模态视图窗口(presentViewController方法)
样例代码为:
GreenViewController *greenViewController = [[GreenViewControlleralloc] init];
方法1:
[self presentModalViewController:greenViewController animated:YES];
方法2:
[self presentViewController:greenViewController animated:YES completion:nil];
两种方法都可以弹出模态视图窗口,方法2使用了block封装,如果在动画弹出模块窗口后有其它的操作,可以使用些方法,这种方法比较常见。
2、 弹出时的动画风格(UIModalTransitionStyle属性)
弹出模态窗口时,如果我们选择了动画显示,那么我们可以通过modalTransitionStyle属性来设置切入动画的风格。
** UIModalTransitionStyleCoverVertical** // 底部滑入。
UIModalTransitionStyleFlipHorizontal // 水平翻转。
UIModalTransitionStyleCrossDissolve // 交叉溶解。
UIModalTransitionStylePartialCurl // 翻页。
动画风格不受设备的限制,即不管是iPhone还是iPad都会根据我们指定的风格显示转场效果。
3、回收模块视图窗口(dismissModalViewControllerAnimated方法)
方法一:
[self dismissModalViewControllerAnimated:YES]
方法二:
[self dismissViewControllerAnimated:YES completion:nil];
4、presentingViewController
presentingViewController是UIViewController的属性,官方文档上这么解释
presentingViewController
The view controller that presented this view controller.
大致意思是:A push B ,B的presentingViewController就是A.
视图控制容器(View Controller Container)
像UINavgationController
、UITabBarController
、UISplitViewController
等都属于view controller container这些类的共性是都有一个类型为数组的对象viewControllers
属性,用于保存一组视图控制器。view controller container
会有自己默认外观。
任何view controller container
对象都可以通过viewControllers
属性来访问子对象(视图),而子对象也可以通过navigationController, tabbarController, splitViewController, parentViewController
找到相应的view controller container
。
当应用以模态形式(通过presentViewController: animated: completion:
推出的视图)显示一个视图时,负责显示的控制器将是view controller container
最顶部的视图,而负责推出的视图。如下图:
A present B,但是B的 presentingViewController却是UITabBarController。
若想让B的presentingViewController变成A需要设置definesPresentationContext
设置成YES,默认是NO,另外需要将显示的视图的modalPresentationStyle
属性设置为UIModalPresentationCurrentContext
代码如下:
navController.modalPresentationStyle = UIModalPresentationCurrentContext;
self.definesPresentationContext = YES;
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion;
有这么依据描述:
The presenting view controller is responsible for dismissing the view controller it presented. If you call this method on the presented view controller itself, UIKit asks the presenting view controller to handle the dismissal.
大致意思是:A push B,那么A就有责任dismiss B,如果在B中调用[self dismissViewControllerAnimated...]就会A中发送dismiss,最终会由有A进行dismiss,相当于在B中执行[self.presentingViewController dismissViewControllerAnimated...]
注: self为弹出的模块视图控制器
更多内容请参见原帖