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

发布于 2022-09-05 14:46:27 字数 482 浏览 10 评论 0

使用 UIAlertController 弹出对话框时,想支持用户点击空白处能自动隐藏对话框;

按照 UIAlertControllerStyleActionSheet 点击空白处不隐藏问题 设置 UIAlertActionStyleCancel 时,需要 StyleUIAlertControllerStyleActionSheet 能生效,当设置为 UIAlertControllerStyleAlert并没有效果;

请问有办法实现此效果吗??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

陌路终见情 2022-09-12 14:46:27
原理

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];
}
长梦不多时 2022-09-12 14:46:27

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];
}
独留℉清风醉 2022-09-12 14:46:27

自己封装一个

逆流 2022-09-12 14:46:27

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文