iOS开发

iOS 自定义UIAlertController点击空白处返回

2019-12-28  本文已影响0人  萨缪

在项目的一个需求中 需要用到UIAlertViewController来实现
需求中的功能已完成, 但是
在测试过程中发现没有实现点击空白处退出弹窗这个功能,因此带给我的用户体验非常不好,所以我就决定也顺便实现这个功能(自己给自己加需求啊啊 并且在对原需求没有影响的情况下)

UIAlertViewController弹出窗口出现后点击任意位置弹出窗口返回
看网上大多数都是在一个分类中实现的,

大体思路是先通过keyWindow找到当前window的最后一个视图,然后给最后一个视图来添加手势,手势中的方法当然是dissMiss啦

我没有这样做,而是自定义UIAlertViewController来实现。

这时候问题出现了

我也同样取的是keyWindow的最后一个视图 然后给其添加手势
但事实上运行后点击空白处并没有返回!!!
为什么呢 查看视图层次了解到


图片.png

我们取到的最后一个视图是这个UITransitionView
但事实上 他的上面还有两层视图!这两个视图与UITransitionView的关系是父子关系


图片.png

并且在打印UITransitionView这两个子视图的名称后,发现他两也叫UITransitionView!!!(看到了吧 他上面还有两个视图!)


图片.png

也就是说我们通过lastObject方法取到的的虽然是UITransitionView,但这个UITransitionView不是该keyWindow下真正的lastObject
所以如果需要自定义UIAlertViewController实现该功能的话 我们还要取出该父同名UITransitionView的第一个子UITransitionView 再对其进行手势方法的设置

源代码如下:

- (void)clickBackToMainView {
    NSArray * arrayViews = [UIApplication sharedApplication].keyWindow.subviews;
    UIView * backToMainView = [arrayViews.lastObject subviews][0];
    backToMainView.userInteractionEnabled = YES;
    UITapGestureRecognizer * backTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backTap)];
    [backToMainView addGestureRecognizer:backTap];
}
- (void)backTap {
    [self.advStyleAlertController dismissViewControllerAnimated:YES completion:nil];
}
上一篇下一篇

猜你喜欢

热点阅读