在iOS 8及更低版本中,当显示键盘时显示UIActionSheet
将在键盘上显示操作表。对于iOS 9,情况已不再如此。
在我的应用中,我们有聊天功能,希望该节目通过键盘进行操作。我们过去常常使用UIActionSheet
,直到iOS 8才能正常工作。在iOS 9中,操作表位于键盘后面。我已经尝试了UIActionSheet
和UIAlertController
。
我已经尝试将操作表放在自己的窗口中并覆盖canBecomeFirstResponder
,这只会让键盘消失。
答案 0 :(得分:30)
我已在我们的应用中实现了这一点。诀窍是让警报控制器出现在不同的窗口上。这就是UIActionSheet
实现的方式,并且在iOS 8上运行良好,但在9月,Apple已将键盘实现移动到具有非常高的窗口级别(10000000)的窗口。修复是为您的警报窗口提供更高的窗口级别(作为自定义double值,而不是使用提供的常量)。
使用具有透明度的自定义窗口时,请务必阅读有关背景颜色的my answer here,以防止在旋转过渡期间窗口变黑。
_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];
答案 1 :(得分:6)
从iOS 11开始,Leo提供的答案已被破坏,因为Apple现在阻止您将窗口级别设置为10000000
以上。修复是实现自定义UIWindow并覆盖windowLevel
接收器:
@interface TopWindow : UIWindow @end
@implementation TopWindow
- (UIWindowLevel) windowLevel {
return 20000000.000;
}
@end
// usage:
UIWindow* w = [[TopWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
w.rootViewController = [UIViewController new];
w.hidden = NO;
[w.rootViewController presentViewController:yourActionSheetController animated:YES completion:nil];
这种方法应该向后兼容,但尚未测试所有已知版本。快乐的黑客!
答案 2 :(得分:4)
根据Leo Natan的回答,我创建了一个Swift扩展程序,用于在键盘上显示警告表。
在我的简短测试中,alertWindow在警报被取消后被解除分配,我相信因为警报之外没有强烈的引用。这意味着您无需在UIAlertActions中隐藏或取消分配它。
extension UIAlertController {
func presentOverKeyboard(animated: Bool, completion: (() -> Void)?) {
let alertWindow = UIWindow(frame: UIScreen.mainScreen().bounds)
// If you need a white/hidden/other status bar, use an appropriate VC.
// You may not need a custom class, and you can just use UIViewController()
alertWindow.rootViewController = whiteStatusBarVC()
alertWindow.windowLevel = 10000001
alertWindow.hidden = false
// Set to a tint if you'd like
alertWindow.tintColor = UIColor.greenColor()
alertWindow.rootViewController?.presentViewController(self, animated: animated, completion: completion)
}
}
private class whiteStatusBarVC: UIViewController {
private override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
}
答案 3 :(得分:-3)
使用UIAlertController而不是UIActionSheet