怎么让 UIAlertControllerStyleAlert 在用户点击空白处时自动隐藏?

阅读 10.7k
4 个回答
原理

UIAlertController是创建一个window, 白色部分为UIAlertController的View, 然后把window加在[UIApplication sharedApplication].windows上.

思路

在点击window, 释放(dismiss)UIAlertController, 执行dismiss会调用类型为style:UIAlertActionStyleCancel或者UIAlertActionStyleDestructive的handler闭包

- (void)showAlert
{
    UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];
    [alertVC addAction:[UIAlertAction actionWithTitle:@"YES" style:UIAlertActionStyleDefault handler:nil]];
    [alertVC addAction:[UIAlertAction actionWithTitle:@"NO" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"NO");
    }]];
    _alertVC = alertVC;
    [self presentViewController:alertVC animated:YES completion:nil];
    
    // 增加点击事件
    UIWindow *alertWindow = (UIWindow *)[UIApplication sharedApplication].windows.lastObject;
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideAlert)];
    [alertWindow addGestureRecognizer:tap];
}
- (void)hideAlert
{
    UIWindow *alertWindow = (UIWindow *)[UIApplication sharedApplication].windows.lastObject;
    [alertWindow removeGestureRecognizer:tap];
    [_alertVC dismissViewControllerAnimated:YES completion:nil];
}

UIAlertControllerStyleAlert 本来就是类似于之前的 UIAlertView,警告弹窗,所以点击空白不会消失而是必须强制做出选择。

基本上你要实现这种效果有两种方式:

  1. 完全自定义,不用 UIAlertController 实现
  2. 取到空白的视图,让其做出点击的响应。

说一下 2 的一个思路:
继承一个 UIAlertController,在视图显示出来的时候取到空白视图,添加手势,当点击的时候关闭 alert。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.closeGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(closeAlert:)];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    UIView *superView = self.view.superview;
    if (![superView.gestureRecognizers containsObject:self.closeGesture]) {
        [superView addGestureRecognizer:self.closeGesture];
        superView.userInteractionEnabled = YES;
    }
}

- (void)closeAlert:(UITapGestureRecognizer *) gesture{
    [self dismissViewControllerAnimated:YES completion:nil];
}

自己封装一个

UIAlertController貌似有添加取消按钮就能按空白隐藏,没添加就不行

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏