GitHub下載:WrapAlertView
背景
對話框?qū)τ贏PP來說是比較常用的控件之一。系統(tǒng)提供了基礎(chǔ)的對話框類UIAlertView以及后來高版本新加的UIAlertController,可以滿足基本的APP需求。
但是隨著APP內(nèi)容的豐富,以及設(shè)計的多樣化,彈出框的設(shè)計樣式也層出不窮,所以自定制的對話框便越來越常用。
每次用到單獨寫對話框顯然不合適,因為有很多重復(fù)性的工作,既浪費精力,又效率低下。所以把這些重復(fù)性的工作抽象出來,封裝成工具類可以很好的提高開發(fā)效率。
WrapAlertView 完全自定制
如下圖所示,是幾種定義好的樣式,用的時候可以直接調(diào)用。
先來看一個調(diào)用的例子
該樣式可自適應(yīng)內(nèi)容,當(dāng)內(nèi)容過多時,可滑動查看。
[[WrapAlertView shareAlertView] showAlertViewBlock:^(UIView *alertView) {
WrapCustomView *view = [[WrapCustomView alloc] initSimple];
view.titleLabel.text = @"UIAlertControllerStyleAlert";
view.contentLabel.text = @"asdasdadasdasdjkahdkahlksjhldakjshdlkjhks\n123djfhaksjdhfkahdkf\nhsddasdadasdasdjk456ahsdadasdasdjkahdkahlksjhldakjshdlkjhks\n123djfhaksjdhfkahdkf\nhsddasdadasdasdjk456ahsdadasdasdjkahdkahlksjhldakjshdlkjhks\n123djfhaksjdhfkahdkf\nhsddasdadasdasdjk456ahsdadasdasdjkahdkahlksjhldakjshdlkjhks\n123djfhaksjdhfkahdkf\nhsddasdadasdasdjk456ahsdadasdasdjkahdkahlksjhldakjshdlkjhks\n123djfhaksjdhfkahdkf\nhsddasdadasdasdjk456ahsdadasdasdjkahdkahlksjhldakjshdlkjhks\n123djfhaksjdhfkahdkf\nhsddasdadasdasdjk456ah\ndkahlksjhldakjshdlkjhksdjfhaksjd\nhfkahdkfhsddasdadasdasdjka\nhdkahlksjhldakjshdlkjhksdjfhaksjdhfkahdkfhsddasdadasdasdjkahdkahlksjhldakjshdlkjhksdjfhaksjdhfkahdkfhsddasdadasdasdjkahdkahlksjhldakjshdlkjhksdjfhaksjdhfkahdkfhsd000";
[view.cancelBtn addTarget:self action:@selector(cancelBtnAction:) forControlEvents:(UIControlEventTouchUpInside)];
[view.sureBtn addTarget:self action:@selector(sureBtnAction:) forControlEvents:(UIControlEventTouchUpInside)];
[alertView addSubview:view];
}];
如果想要自定制彈出框的視圖,只需在block中創(chuàng)建視圖并添加到alertView上即可。
不用擔(dān)心你的視圖會超出屏幕,視圖在回調(diào)完成后會自適應(yīng)子視圖。如果過長,會采用滑動視圖的方案來容納。
關(guān)于自定義視圖的實現(xiàn)方式
如果是習(xí)慣寫代碼搭建視圖的同學(xué),直接在block中創(chuàng)建就可以。
此處的WrapCustomView采用Xib方式創(chuàng)建,這種方式更直觀,更高效。此處要提醒一下,使用Xib會出現(xiàn)一個問題,解決方案請參考 這里。
設(shè)計目標(biāo)
1.允許完全自定制view樣式。
2.自適應(yīng)內(nèi)容寬度和高度。
3.使用單例訪問。
4.擁有幾種默認的樣式。
設(shè)計思路
alert的樣式變得是在子視圖的樣式,不變的是承載頁,也就是windows層。所以為了實現(xiàn)完全自定制,子視圖就要放到外面創(chuàng)建,也就是說封裝起來的是承載頁以及一些不變的元素。
@property (nonatomic, strong) UIWindow *WR_window; //windows層
@property (nonatomic, strong) UIView *WR_blackView; //底層透明黑色視圖層
@property (nonatomic, strong) UIView *WR_backView; //可操作視圖
@property (nonatomic, assign) BOOL WR_isVisible; //是否已經(jīng)顯示
還有幾個操作方法
/**
單例
@return 視圖本身
*/
+(WrapAlertView *)shareAlertView;
/**
顯示視圖,block中實現(xiàn)自定制視圖,指定類型
@param type 類型WrapAlertViewType
@param block 調(diào)用處實現(xiàn)的代碼塊
*/
-(void)showType:(WrapAlertViewType)type block:(CreateWrapAlertViewBlock)block;
/**
顯示視圖,block中實現(xiàn)自定制視圖 Alert
@param block 調(diào)用處實現(xiàn)的代碼塊
*/
-(void)showSheetViewBlock:(CreateWrapAlertViewBlock)block;
/**
顯示視圖,block中實現(xiàn)自定制視圖 Sheet
@param block 調(diào)用處實現(xiàn)的代碼塊
*/
-(void)showAlertViewBlock:(CreateWrapAlertViewBlock)block;
/**
隱藏視圖
*/
-(void)hide;
/**
是否允許點擊透明黑色背景視圖隱藏界面
@param canHideByTapBlack YES-允許, NO-不允許,默認YES
*/
-(void)canHideByTapBlack:(BOOL)canHideByTapBlack;
其中有個block參數(shù)CreateWrapAlertViewBlock,定義如下
typedef void(^CreateWrapAlertViewBlock)(UIView *alertView);
效果圖

詳細代碼請至GitHub下載:WrapAlertView
如有問題請留言,謝謝!