Fork me on GitHub

iOS开发 提示信息被键盘遮挡解决方案

我们在开发的时候,有需要把一个view显示到window,又不想被键盘的window所遮挡。在iOS11之前的系统中,我们是这么添加:

1
[[[UIApplication sharedApplication].windows lastObject] addSubview:view];

但是iOS11中出现了一个新的特性,键盘的window一旦在App中被调起后就不会再被remove,而是hidden状态,这时候我们的view就会被添加到一个隐藏的window上面导致,直接导致无法正常显示。

我们项目中使用了Toast这个第三方库,所以需要对其做一些封装,核心代码如下所示(已适配iOS11系统):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
+ (void)showMessageToWindowCenter:(NSString *)msg {

if (msg.length < 1) { return; }

NSTimeInterval duration = [self durationForMsg:msg];

dispatch_async(dispatch_get_main_queue(), ^{
UIWindow *window = [self findKeyWindow];
[window makeToast:msg duration:duration position:CSToastPositionCenter];
});
}

+ (UIWindow *)findKeyWindow {

UIApplication *app = [[UIApplication sharedApplication] keyWindow];

UIWindow *realKeyWindow = app.windows.firstObject;
NSInteger count = app.windows.count;
for (NSInteger i = count - 1; i > 0; i --) {

UIWindow *showWindow = [app.windows objectAtIndex:i];
if (showWindow.hidden) {
continue;
}
realKeyWindow = showWindow;
break;
}
return realKeyWindow;
}

目前还有一种情况没有处理(没有大碍):Toast先弹出来,然后再调起键盘,这个时候键盘还是会把已出现的Toast挡住。

------------- 本文结束感谢您的阅读 -------------