??UIAlertController 是ios 8.0以后才支持的彈窗效果章钾,目前支持的彈窗效果有兩種:
1.UIAlertControllerStyleActionSheet 支持從底部彈出的選項(xiàng)彈窗畸颅,允許點(diǎn)擊空白區(qū)后近尚,整個(gè)彈窗消失
2.UIAlertControllerStyleAlert 支持從屏幕中央彈出選項(xiàng)窗,不支持點(diǎn)擊空白區(qū)退出界面
??第一種情況不必多說(shuō)脚粟,有時(shí)候我們的需求是,使用系統(tǒng)的彈窗券坞,希望點(diǎn)擊背景區(qū)域锋边,彈窗消失侈净,那么怎么實(shí)現(xiàn)呢尊勿?接下來(lái),我給大家分析一下畜侦,具體實(shí)現(xiàn)原理和步驟元扔。
一、我們先來(lái)看看原圖效果圖:
二旋膳、再來(lái)看看彈窗彈出后的視圖層結(jié)構(gòu)圖(我使用reveal查看)
三澎语、那么我來(lái)分析一下,圖層之間的關(guān)系
圖層1名稱UILayoutContainerView,是彈出彈窗方法中[self presentViewController:actionSheet animated:YES completion:^{ [actionSheet tapGesAlert]; }];
self所在的view層验懊。
圖層2 名稱是UITransitionView擅羞,屬于彈出彈窗的過(guò)渡view。圖層1和圖層2是平級(jí)關(guān)系义图。
圖層3 名稱 和圖層4名稱都是常規(guī)的UIView减俏,兩者都是圖層2 的子subview。
??那么碱工,現(xiàn)在我們要做的就是把圖層2娃承,3奏夫,4找到,并賦予他們其中一個(gè)有點(diǎn)擊消失事件即可历筝。為什么是三者中的其中一個(gè)都行呢酗昼?因?yàn)楦鶕?jù)父子圖層的事件點(diǎn)擊傳遞關(guān)系,也就是平時(shí)說(shuō)的響應(yīng)者鏈機(jī)制梳猪,一個(gè)圖層接收到事件后麻削,會(huì)一直向上查找能接收點(diǎn)擊事件的圖層。我們?nèi)庋劭吹降幕疑珡棿氨尘捌鋵?shí)就是圖層3坐在位置春弥。既然現(xiàn)在知道了圖層關(guān)系呛哟,那么我們就可以做很多操作了。比如改變顏色惕稻,添加事件竖共,甚至添加另外一個(gè)圖層等等。
四俺祠、實(shí)現(xiàn)代碼
我們可以在UIAlertController中添加category,添加一個(gè)方法借帘,實(shí)現(xiàn)點(diǎn)擊退出的功能蜘渣!直接上代碼
.h實(shí)現(xiàn)
#import <UIKit/UIKit.h>
@interface UIAlertController (TapGesAlertController)
- (void)tapGesAlert;
@end
.m 實(shí)現(xiàn)
#import "UIAlertController+TapGesAlertController.h"
@implementation UIAlertController (TapGesAlertController)
- (void)tapGesAlert{
NSArray * arrayViews = [UIApplication sharedApplication].keyWindow.subviews;
if (arrayViews.count>0) {
//array會(huì)有兩個(gè)對(duì)象,一個(gè)是UILayoutContainerView肺然,另外一個(gè)是UITransitionView蔫缸,我們找到最后一個(gè)
UIView * backView = arrayViews.lastObject;
//我們可以在這個(gè)backView上添加點(diǎn)擊事件,當(dāng)然也可以在其子view上添加际起,如下:
// NSArray * subBackView = [backView subviews];
// backView = subBackView[0]; 或者如下
// backView = subBackView[1];
backView.userInteractionEnabled = YES;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap)];
[backView addGestureRecognizer:tap];
}
}
-(void)tap
{
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
注意:使用的時(shí)候拾碌,必須在彈窗彈出后,才能調(diào)用這個(gè)方法街望?因?yàn)閺棾龊髨D層2UITransitionView才會(huì)存在校翔,調(diào)用早了,就查找不到這個(gè)圖層灾前。如下使用:在completion中實(shí)現(xiàn)這個(gè)方法防症,
[self presentViewController:alertController animated:YES completion:^{
? [alertController tapGesAlert];
? }];