-
題記
Alert,項(xiàng)目常用的東西锋恬,為了使用起來(lái)代碼更簡(jiǎn)單屯换,封裝!
本文涉及最直接的問(wèn)題:
1.UIAlertController和UIAlertView的默認(rèn)屬性修改与学,如Title彤悔,Message的textColor、font等
2.實(shí)現(xiàn)封裝UIAlertView和UIAlertController索守,二合一適配系統(tǒng)版本
- 我不想看下去了晕窑,直接給我代碼吧!點(diǎn)這里
-
UIAlertController&UIAlertView的屬性修改
-
思路
比較簡(jiǎn)單卵佛,既然沒(méi)有公有屬性杨赤,那我們看私有,內(nèi)部總得對(duì)他設(shè)置级遭,所以我們直接查看私有屬性和方法望拖,這個(gè)方法同樣適用于修改一些系統(tǒng)不允許修改的控件屬性(舉一反三)。所以想到的是KVC設(shè)置私有屬性挫鸽,但是我們需要先得到Key说敏,Key我們直接利用runtime便利對(duì)象所有實(shí)例變量,加以猜測(cè)試探丢郊。 - 代碼--->打印私有屬性方法
-
思路
// 獲得所有ivar
-(NSArray *)getAllIvar:(id)object {
NSMutableArray *array = [NSMutableArray array];
unsigned int count;
Ivar *ivars = class_copyIvarList([object class], &count);
for (int i = 0; i < count; i++) {
Ivar ivar = ivars[i];
const char *keyChar = ivar_getName(ivar);
NSString *keyStr = [NSString stringWithCString:keyChar encoding:NSUTF8StringEncoding];
id valueStr = [object valueForKey:keyStr];
NSDictionary *dic = nil;
if (valueStr) {
dic = @{keyStr : valueStr};
} else {
dic = @{keyStr : @"值為nil"};
}
[array addObject:dic];
}
return [array copy];
}
return [array copy];
}
-
分析
下面是我自己打印并抓取UIAlertController和UIAlertView的幾個(gè)重要的屬性盔沫,咱們看一下
// UIAlertController
"_cancelAction",
preferredStyle,
attributedTitle,
attributedMessage,
// UIAlertView
"_alertController" = "<UIAlertController: 0x7fc712c07410>";
1.看到attributed這個(gè)單詞,相信大家大概都懂了枫匾,想到NSAttributedString那么就很開(kāi)放了架诞,字體大小,顏色干茉,其他樣式隨便設(shè)置谴忧,問(wèn)題迎刃而解。
2.發(fā)現(xiàn)UIAlertView里面帶的是_alertController,原來(lái)蘋(píng)果早就在內(nèi)部改變了AlertView角虫,里面并沒(méi)有contentView沾谓,全丟到這個(gè)私有屬性里了,所以要修改AlertView樣式還是在修改內(nèi)部的AlertController戳鹅,私有屬性同上
3._cancelAction均驶,還可以往里深入,繼續(xù)打印探究枫虏,改變其顏色字體等
- 代碼實(shí)現(xiàn)--->UIAlertController具體改變Message,Title的一切
// 當(dāng)然你也可以往attributedStringadd加一些顏色和其他樣式
NSMutableAttributedString *alertControllerMessageStr = [[NSMutableAttributedString alloc] initWithString:message];
NSMutableParagraphStyle *ps = [[NSMutableParagraphStyle alloc] init];
[ps setAlignment:NSTextAlignmentLeft];
[alertControllerMessageStr addAttribute:NSParagraphStyleAttributeName value:ps range:NSMakeRange(0, message.length)];
[alertControllerMessageStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:16] range:NSMakeRange(0, message.length)];
[alertVc setValue:alertControllerMessageStr forKey:@"attributedMessage"];
- 代碼實(shí)現(xiàn)--->UIAlertView具體改變Message,Title的一切
UIAlertController *alertVc = [alertView valueForKey:@"alertController"];
NSMutableAttributedString *alertControllerMessageStr = [[NSMutableAttributedString alloc] initWithString:message];
[alertControllerMessageStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:16] range:NSMakeRange(0, message.length)];
[alertVc setValue:alertControllerMessageStr forKey:@"attributedMessage"];
-
實(shí)現(xiàn)對(duì)UIAlertController和UIAlertView的封裝
-
思路
根據(jù)version的8.0上下妇穴,適配2種Alert爬虱,實(shí)習(xí)回調(diào)block處理點(diǎn)擊,或者不回調(diào)來(lái)展示腾它,具體看代碼跑筝。
-
思路
-
使用
打開(kāi)完整代碼引入UIViewController+TggAlertExtension,如下圖
- 代碼--->下面是經(jīng)過(guò)封裝適配的直接可以使用的API
// 彈出AlertView帶左對(duì)齊Message携狭,
-(void)tgg_presentAlertViewWithMainTitle:(NSString *)mainTitle
LeftTextmessage:(NSString *)message
firstAction:(NSString *)firstAction
secondAction:(NSString *)secondAction
successBlock:(SuccessBlock)successBlock;
// 彈出AlertView就一個(gè)action继蜡,無(wú)message無(wú)block
-(void)tgg_presentAlertViewWithMainTitle:(NSString *)mainTitle
actionTitle:(NSString *)actionTitle;
// 彈出AlertView就一個(gè)action,無(wú)message
-(void)tgg_presentAlertViewWithMainTitle:(NSString *)mainTitle
actionTitle:(NSString *)actionTitle
successBlock:(SuccessBlock)successBlock;
// 彈出AlertView就一個(gè)action逛腿,無(wú)title無(wú)block
-(void)tgg_presentAlertViewWithMessage:(NSString *)message
actionTitle:(NSString *)actionTitle;
// 彈出AlertView就一個(gè)action,無(wú)title
-(void)tgg_presentAlertViewWithMessage:(NSString *)message
actionTitle:(NSString *)actionTitle
successBlock:(SuccessBlock)successBlock;
// 彈出AlertView就一個(gè)action沒(méi)有block
-(void)tgg_presentAlertViewWithMainTitle:(NSString *)mainTitle
message:(NSString *)message
actionTitle:(NSString *)actionTitle;
// 彈出AlertView就一個(gè)action的基礎(chǔ)方法仅颇,帶block回調(diào)
-(void)tgg_presentAlertViewWithMainTitle:(NSString *)mainTitle
message:(NSString *)message
actionTitle:(NSString *)actionTitle
successBlock:(SuccessBlock)successBlock;
// 彈出AlertView的基本方法,最多2個(gè)action
-(void)tgg_presentAlertViewWithMainTitle:(NSString *)mainTitle
message:(NSString *)message
firstAction:(NSString *)firstAction
secondAction:(NSString *)secondAction
successBlock:(SuccessBlock)successBlock;