先贴打开透明UIViewController代码
var vc = DetailViewController();
vc.modalPresentationStyle = .Custom
self.presentViewController(vc, animated: true, completion: nil)
我的个人理解
在这里,先说一下安卓的打开页面方式
startActivity(intent);
startActivityForResult(intent, requestCode);
会安卓的都知道 startActivity是Context的函数,而startActivityForResult是
Activity的函数
在IOS中,类似 startActivity的打开方式presentViewController
Activity 可以理解为 UIViewController
而要打开一个透明的Activity,我们在安卓中,只要配置window的背影色为透明色,就可了.
而在IOS中,设置背影透明色,是不可行的
这里先说,为什么不行.IOS每打开一个UIViewController会对应一个UITransitionView 就
是所谓的UIViewController的最底层的一个View.当然,它也是一个画布画出来的View而已
首先:UIVindow是每一个IOS的项目的最底层的一个容器
而每次打开一个UIViewController,会在UIVindow添加一个UIViewController
层次关系是这样的
UIVindow
UITransitionView
UITransitionView
UITransitionView
注:重点在这里,永远只有一个 UIVindow,每打开一个UIViewController,就会添加一个
UITransitionView
在每个UITransitionView中都存在一个UIView,这个,就是在UIViewController中的
self.view 这个如果不搞清楚,层级关系乱掉了,页面会麻烦的.
我们想做到的透明,就是把UITransitionView给透明掉.这个思路,本身是没有错的,但是
UITransitionView透明之后呢?你想看到的是上一个页面的UITransitionView,就是上个页
面的self.view的内容.
不管怎么做,都做不到透明看到上个页面的东西.
IOS的机制是这样设定的,你要打开一个页面,要声明,这个页面是不是透明的,如果你不设置.默认
是不透明的,在你打开一个新的UITransitionView的时候,你只能看到在这个页面的所包含的
view,而上个页面的UITransitionView中的view都是被隐藏的,所以,你只能看到一个黑色的
背影,这个黑色,就是UIVindow的背影色了
默认的结果是这样的:
UIVindow
UITransitionView(上上页)
UITransitionView(上页)
UITransitionView(当前的页)
UIView(即self.view)
所以,不设置打开模式为透明,是做不到透明的.
打开默认的设置是这样的:
modalPresentationStyle = .Custom
modalPresentationStyle是UIViewController的函数.
只要声明,打开为此模式,就好了.这个时候,页面结构是这样的
UIVindow
UITransitionView(上上页)
UITransitionView(上页)
UIView(即self.view)
UITransitionView(当前的页)
UIView(即self.view)
这样,就可以看到上个页面的self.view了,就达到了透明的效果了
打开透明的代码如下:
var vc = DetailViewController();
vc.modalPresentationStyle = .Custom
self.presentViewController(vc, animated: true, completion: nil)
注:如果加打开动画,即UIViewControllerAnimatedTransitioning这种打开动画的转场模
式,在这里的添加View的时候,进行处理,就OK了.