开发中经常碰到需要添加一个半透明的蒙版,比如各类提示弹窗等。
UIWindow图层上添加蒙版
优先级
例如蒙版也可添加到self.navigationController.view图层上或者self.tabBarController.view图层上
self.view < self.navigationController.view < self.tabBarController.view < UIWindow
UIWindow:一般作为UIView的容器
应用场景
当需要将某些控件显示到最上层时就可以创建一个window,然后将空间添加到window上
支付宝、记账类软件认证界面(手势解锁)大部分都是用UIWindow做的
注意
1.一般情况下不要随意创建window,不要滥用,因为只要创建就会自动添加到界面上(不用addsubview!!!),那么如果滥用window会导致应用程序的层级结构混乱
2.window是有级别的,级别越高就显示在越顶层(键盘级别最高)
默认有3个级别:UIWindowLevelNormal(0.0) < UIWindowLevelAlert(1000.0) < UIWindowLevelStatusBar(2000.0)
也可自定义window.windowLevel = 4000.0;
UIWindow特点
只要创建就会自动添加到界面上
系统弹出UIAlertView、弹出键盘、来短信、来电、电量不足等也是用的UIWindow
如果需要window监听点击事件需要设置frame,因为window创建后没有frame
UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
移除window可在点击方法里直接 window = nil;
//cover为frame是[UIScreen mainScreen].bounds的半透明或透明色button
UIWindow *window = [UIApplication sharedApplication].keyWindow;
[window addSubview:cover];
上个案例,自定义的一个指纹锁弹窗,其中touchidView为xib自定义的view样式,具体可根据实际需要自定义以及添加代理等方法。
#pragma mark - 添加touchIDView弹窗
- (void)popCoverview{
//设置蒙版
self.coverView = [[UIViewalloc]initWithFrame:[UIScreenmainScreen].bounds];
self.coverView.backgroundColor = [UIColorblackColor];
self.coverView.alpha =0.6;
//添加蒙版上弹窗视图
self.touchidView = [[NSBundlemainBundle]loadNibNamed:@"DDTouchidView"owner:selfoptions:nil].lastObject;
self.touchidView.center =self.coverView.center;
self.touchidView.delegate =self;
//实现弹出方法
UIWindow *window = [UIApplicationsharedApplication].keyWindow;
window.windowLevel =UIWindowLevelNormal;
[window addSubview:self.coverView];
[window addSubview:self.touchidView];
}