在項目中經(jīng)常會碰到一些全屏的彈窗,最簡單的方法就是把這個View添加到keyWindow上面
@interface TestView : UIView
- (void)show;
@end
@implementation TestView
- (instancetype)init
{
if (self = [super init]) {
//初始化以及添加subview
}
return self;
}
- (void)show
{
[[UIApplication sharedApplication].keyWindow addSubview:self];
}
運行結(jié)果我們可以發(fā)現(xiàn)如下的效果,但是彈出視圖位于狀態(tài)欄下方,也許此時設(shè)計師就提出來說狀態(tài)欄需要放到彈出視圖的下方。
彈出視圖位于狀態(tài)欄下方是因為承載APP大多數(shù)界面的那個window的windowlevel沒有狀態(tài)欄的windowlevel高。

如果需要將彈出視圖放到狀態(tài)欄上方,可以考慮調(diào)整keywindow的windowlevel
- (void)show
{
UIWindow *window = [UIApplication sharedApplication].keyWindow;
window.windowLevel = UIWindowLevelStatusBar + 1;
[window addSubview:self];
}
運行結(jié)果發(fā)現(xiàn)狀態(tài)欄不見了,這個keywindow來到了狀態(tài)欄的上方,并且keywindow的背景是白色,所以導(dǎo)致狀態(tài)欄不可見了,另外修改keywindow的windowlevel可能會導(dǎo)致其他界面出現(xiàn)問題。

最后想到新建一個window,該window的windowlevel比狀態(tài)欄的大一點點,然后把彈出視圖加到這個window上就可以了
@interface TestView()
@property (nonatomic, strong) UIWindow *window;
@end
@implementation TestView
- (instancetype)init
{
if (self = [super init]) {
//省略...
}
return self;
}
- (void)show
{
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = [UIViewController new];
self.window.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.3];
self.window.windowLevel = UIWindowLevelStatusBar + 1;
[self.window makeKeyAndVisible];
[self.window addSubview:self];
}
- (void)hide
{
[self.window resignKeyWindow];
[self removeFromSuperview];
}
這里需要注意是window必須聲明為強引用的,如果window是局部變量,那么在方法結(jié)束后window就被銷毀了,從而導(dǎo)致彈出視圖無法顯示。
運行結(jié)果如下圖所示
