完全自定制的AlertView,想怎么玩就怎么玩O(∩_∩)O哈哈~

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)容過多時,可滑動查看。

IMG_0103.PNG
[[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);

效果圖

IMG_0102.PNG

IMG_953CE020A5AD-1.jpeg

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容