在键盘上显示 UIAlertController [英] Show UIAlertController over keyboard

查看:19
本文介绍了在键盘上显示 UIAlertController的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 iOS 8 及更低版本中显示 UIActionSheet 当键盘出现时,将在键盘上显示操作表.在 iOS 9 中,情况不再如此.

在我的应用程序中,我们有一个聊天功能,并希望通过键盘显示一个动作.我们曾经使用 UIActionSheet,它在 iOS 8 之前运行良好.在 iOS 9 中,操作表位于键盘后面.我已经尝试过 UIActionSheetUIAlertController.

我们想要的是一个类似 messages.app 中的操作表

我尝试将操作表放在它自己的窗口中并覆盖 canBecomeFirstResponder ,这只是让键盘消失了.

解决方案

我已经在我们的应用程序中实现了这一点.诀窍是让警报控制器出现在不同的窗口上.这就是 UIActionSheet 实现的方式,并且在 iOS 8 上运行良好,但在 9 上,Apple 已将键盘实现移动到具有非常高窗口级别 (10000000) 的窗口.解决方法是为您的警报窗口提供更高的窗口级别(作为自定义双精度值,不使用提供的常量).

使用具有透明度的自定义窗口时,请务必阅读

In iOS 8 and lower show a UIActionSheet when keyboard is presented will present the action sheet over the keyboard. With iOS 9 this is no longer the case.

In my app we have a chat functionality and want the show a action over the keyboard. We used to use UIActionSheet which worked fine until iOS 8. In iOS 9 the action sheet is present behind the keyboard. I've tried both UIActionSheet and UIAlertController.

What we want is a action sheet like in messages.app

I've tried placing the action sheet in it own window and overriding canBecomeFirstResponder which just made the keyboard disappear.

解决方案

I have implemented exactly this in our app. The trick is to have the alert controller appear on a different window. This is how the UIActionSheet implementation does it, and works great on iOS 8, but on 9, Apple has moved the keyboard implementation to a window which has a very high window level (10000000). The fix is to give your alert window an even higher window level (as a custom double value, not using the provided constants).

When using a custom window which will have transparency, make sure to read my answer here, regarding background color, to prevent window becoming black during rotation transitions.

_alertWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
_alertWindow.rootViewController = [UIViewController new];
_alertWindow.windowLevel = 10000001;
_alertWindow.hidden = NO;
_alertWindow.tintColor = [[UIWindow valueForKey:@"keyWindow"] tintColor];

__weak __typeof(self) weakSelf = self;

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Test" message:nil preferredStyle:UIAlertControllerStyleActionSheet];
[alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
    weakSelf.alertWindow.hidden = YES;
    weakSelf.alertWindow = nil;
}]];
[alert addAction:[UIAlertAction actionWithTitle:@"Test" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    weakSelf.alertWindow.hidden = YES;
    weakSelf.alertWindow = nil;
}]];

[_alertWindow.rootViewController presentViewController:alert animated:YES completion:nil];

这篇关于在键盘上显示 UIAlertController的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆