谈谈改变 UIAlertView 和 UIActionSheet 的颜色

iOS8及以上应该使用的方式

对于>=iOS8来说, UIAlertView,UIActionSheet都被 UIAlertController替代了,
建立一个 UIAlertView的方式

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title"
                                                                                 message:@"Message"
                                                                          preferredStyle:UIAlertControllerStyleAlert];
建立一个UIActionSheet
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title"
                                                                                 message:@"Message"
                                                                          preferredStyle:UIAlertControllerStyleActionSheet];
                                                                          

改变 UIAlertController 颜色的方式

        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title"
                                                                                 message:@"Message"
                                                                          preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *cancelButton = [UIAlertAction actionWithTitle:@"Cancel"
                                                               style:UIAlertActionStyleCancel
                                                             handler:nil];
        UIAlertAction *destructiveButton = [UIAlertAction actionWithTitle:@"Destructive"
                                                                    style:UIAlertActionStyleDestructive
                                                                  handler:nil];
        UIAlertAction *otherButton1 = [UIAlertAction actionWithTitle:@"Button 1"
                                                               style:UIAlertActionStyleDefault
                                                             handler:nil];
        UIAlertAction *otherButton2 = [UIAlertAction actionWithTitle:@"Button 2"
                                                               style:UIAlertActionStyleDefault
                                                             handler:nil];
        [alertController addAction:cancelButton];
        [alertController addAction:destructiveButton];
        [alertController addAction:otherButton1];
        [alertController addAction:otherButton2];
        alertController.view.tintColor = [UIColor colorWithRed:0.7596 green:0.5249 blue:1.0 alpha:1.0];//这句就可以了! 当然了,如果你没设置这一句,
        [self presentViewController:alertController animated:YES completion:nil];
UIAlertViewpic1.png

总结出来的可以用来改变颜色的方式

方法1:
修改alertController.view.tintColor的tintColor

alertController.view.tintColor = [UIColor colorWithRed:0.7596 green:0.5249 blue:1.0 alpha:1.0];

但是,实际上,在测试的时候,发现,这种修改后,手指在选项上滑动后,颜色就又变为默认的蓝色了.......,具体可以看下面的gif动画演示


UIAlertViewpic2.gif

另外
stackoverflow上很多说是在AppDelegate中添加

[[UIView appearanceWhenContainedInInstancesOfClasses:@[[UIAlertController class]]] setTintColor:[UIColor redColor]];

可以让所有的UIAlertController的颜色都改变,但是,但是,经过我测试,添加这句根本没有效果,不仅没有效果,添加了这句后,这样的设置alertController.view.tintColor = [UIColor colorWithRed:0.7596 green:0.5249 blue:1.0 alpha:1.0];将不再有效,系统弹出的是默认的颜色了!!!!
至于为什么会这样,我也没有得到一个可以让自己信服的理由!

方法2:
修改window的tintColor,这种方式不会有方式一的问题

[UIApplication sharedApplication].keyWindow.tintColor = [UIColor yellowColor];

至于这句在什么地方加,当然是随你心情了,只要在其显示之前添加,都是OK的

方法3:
私有API(注意这种方式不能上appstore的,会因为调用私有api被苹果拒的)
iOS-Runtime-Headers中UIAlertAction头文件我们可以看到
UIAlertAction 有一个私有api

- (void)_setTitleTextColor:(id)arg1;

从名字就可以看出,这个是改变文字颜色的

在代码中

        UIAlertAction *otherButton1 = [UIAlertAction actionWithTitle:@"Button 1"
                                                               style:UIAlertActionStyleDefault
                                                             handler:nil];
        [otherButton1 performSelector:@selector(_setTitleTextColor:) withObject:[UIColor yellowColor]];

就可以实现了!

方法4 :
使用KVC

  [otherButton1 setValue:[UIColor yellowColor] forKey:@"titleTextColor"];
  //[otherButton1 setValue:[UIColor yellowColor] forKey:@"_titleTextColor"];

这种方式,是合法的方式调用私有方法或者属性,这个是KVC的特性决定的

使用以前的UIAlertView的怎么改变呢?

网上的第一种方式

使用Appearance的方式
ios9之前

  [[UIView appearanceWhenContainedIn:[UIAlertView class], nil] setTintColor:[UIColor redColor]];
  [[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor redColor]];

ios9之后

    [[UIView appearanceWhenContainedInInstancesOfClasses:@[[UIAlertView class]]] setTintColor:[UIColor redColor]];
    [[UIView appearanceWhenContainedInInstancesOfClasses:@[[UIAlertController class]]] setTintColor:[UIColor redColor]];

经过测试,是起不到任何作用的,因为苹果官方上说到了
Appearance of Alert Views
You cannot customize the appearance of alert views.

网上的第二种方式:重载UIAlertView

可以参考how-to-change-color-of-the-uialertview-dialog-in-ios

但是这个有一个问题,UIAlertView内部的实现,在不同版本是不一样的,所以即使在一个sdk上可以了,其它的也不一定可以,尤其是在iOS9中,
我们从iOS-Runtime-Headers查看UIAlertView的头文件

@interface UIAlertView : UIView {
    BOOL __currentlyRunningModal;
    NSMutableArray *_actions;
    UIAlertController *_alertController;
    BOOL _alertControllerShouldDismiss;
    int _alertViewStyle;
    int _cancelIndex;
    id _context;
    int _defaultButtonIndex;
    id _delegate;
    BOOL _dismissingAlertController;
    UIViewController *_externalViewControllerForPresentation;
    int _firstOtherButtonIndex;
    BOOL _handlingAlertActionShouldDismiss;
    BOOL _hasPreparedAlertActions;
    BOOL _isPresented;
    NSString *_message;
    _UIAlertControllerShimPresenter *_presenter;
    UIAlertView *_retainedSelf;
    BOOL _runsModal;
    NSString *_subtitle;
}

可以看到,其内部实现可能已经换为 VIewController的形式来实现了!!

所以这种方式也不行的!!

网上的第三种方式

how-to-change-uialertview-text-color,枚举UIAlertView的子视图,然后更改

-(void)willPresentAlertView:(UIAlertView *)alertView
{
    UILabel *titleLabel = [alertView valueForKey:@"_titleLabel"];
    titleLabel.font = [UIFont fontWithName:@"Arial" size:18];
    [titleLabel setTextColor:[UIColor whiteColor]];

     UILabel *body = [alertView valueForKey:@"_bodyTextLabel"];
     body.font = [UIFont fontWithName:@"Arial" size:15];
     [body setTextColor:[UIColor whiteColor]];

}

但是,这个是不行的!!!在iOS9中,内部实现已经改变,根本没有_titleLabel ,如果你这样写,直接就crash了

那么,难道没有方法改变UIAlertView的颜色了么???
有啊,完全的使用自定义的AlertView.

第四种方式,也是唯一可行的方式

完全使用自定义的AlertView,这样,什么颜色更改呀,字体更改呀,都没有问题了!!
可以参考
https://github.com/Friend-LGA/LGAlertView

https://github.com/szk-atmosphere/MSAlertController

UIActionSheet的颜色改变

同上述的UIAlertView的方式!

参考
uialertcontroller-custom-font-size-color有讨论

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,090评论 4 62
  • 目录 第十四章:网瘾少年 第十五章:被抓包 "嗯嗯……"我兴奋的连忙点头。 "过去一点。"看着他握着鼠标,手指熟练...
    九命猫儿阅读 238评论 2 2
  • 有些人特别爱说这样的话:(对孩子)你为什么不努力?你要认真呀。你要踏踏实实的去做呀。…… 努力,认真,踏踏实实……...
    可可儿妈阅读 594评论 0 0
  • 1,勇敢为自己定价,不打折,把自己擅长的行业做专做精,使别人觉得物有所值而不是价格低廉。提高专业素养。 2,自我提...
    烟紫雪阅读 200评论 0 2
  • 一、产品概述 产品定位 基于职业的垂直社区-产品经理交流成长社区 PMCAFF成立于2010年5月,由阿里的产品专...
    云洛天涯阅读 4,484评论 2 16