在项目的一个需求中 需要用到UIAlertViewController来实现
需求中的功能已完成, 但是
在测试过程中发现没有实现点击空白处退出弹窗这个功能,因此带给我的用户体验非常不好,所以我就决定也顺便实现这个功能(自己给自己加需求啊啊 并且在对原需求没有影响的情况下)
UIAlertViewController弹出窗口出现后点击任意位置弹出窗口返回
看网上大多数都是在一个分类中实现的,
大体思路是先通过keyWindow找到当前window的最后一个视图,然后给最后一个视图来添加手势,手势中的方法当然是dissMiss啦
我没有这样做,而是自定义UIAlertViewController来实现。
这时候问题出现了
我也同样取的是keyWindow的最后一个视图 然后给其添加手势
但事实上运行后点击空白处并没有返回!!!
为什么呢 查看视图层次了解到
我们取到的最后一个视图是这个UITransitionView
但事实上 他的上面还有两层视图!这两个视图与UITransitionView的关系是父子关系
并且在打印UITransitionView这两个子视图的名称后,发现他两也叫UITransitionView!!!(看到了吧 他上面还有两个视图!)
也就是说我们通过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];
}