美文网首页iOS开发技术iOSiOS开发(OC)
[iOS]改变UIAlertController的标题、内容的字

[iOS]改变UIAlertController的标题、内容的字

作者: PlutoMa | 来源:发表于2016-03-23 22:36 被阅读27525次

    在开发中,弹出框是必不可少的,通常情况下,我们只要弹出系统自带的弹出框就可以。but,在某些情况下,万恶的UI会要求你修改显示文字的大小、颜色,虽然系统自带有一种红色字体的UIAlertAction,但是这种Action并不能放在Cancel位置,所以,更多时候,需要我们自己修改文字字体和颜色。
    我采用的方法是KVC:
    正常情况下,我们配置出来的UIAlertController是这样的:

    123.png

    或者是这样:

    345.png

    代码如下:

        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"提示内容" preferredStyle:UIAlertControllerStyleAlert];
    //    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"提示内容" preferredStyle:UIAlertControllerStyleActionSheet];
        
        UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"Default" style:UIAlertActionStyleDefault handler:nil];
        UIAlertAction *destructiveAction = [UIAlertAction actionWithTitle:@"Destructive" style:UIAlertActionStyleDestructive handler:nil];
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
        
        [alertController addAction:defaultAction];
        [alertController addAction:destructiveAction];
        [alertController addAction:cancelAction];
        
        [self presentViewController:alertController animated:YES completion:nil];
    

    代码里展示了系统提供的三种UIAlertAction,现在我们要对文字的字体和颜色进行设置:

    • 1.标题和提示内容的文字设置
      代码如下:
    //修改title
        NSMutableAttributedString *alertControllerStr = [[NSMutableAttributedString alloc] initWithString:@"提示"];
        [alertControllerStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, 2)];
        [alertControllerStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:17] range:NSMakeRange(0, 2)];
        [alertController setValue:alertControllerStr forKey:@"attributedTitle"];
    
        //修改message
        NSMutableAttributedString *alertControllerMessageStr = [[NSMutableAttributedString alloc] initWithString:@"提示内容"];
        [alertControllerMessageStr addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(0, 4)];
        [alertControllerMessageStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:20] range:NSMakeRange(0, 4)];
        [alertController setValue:alertControllerMessageStr forKey:@"attributedMessage"];
    

    效果如下:

    123.png
    • 2.设置按钮文字,就拿取消按钮距离:
      代码如下:
        //修改按钮
        if (cancelAction valueForKey:@"titleTextColor") {
            [cancelAction setValue:[UIColor redColor] forKey:@"titleTextColor"];
        }
    

    效果如下:

    123.png

    至于里面的key值怎么得到的,过两天会写一篇文章来讲述。

    相关文章

      网友评论

      • 给自己定个小目标:怎么修改Destructive。这个颜色
      • 上官馨玥:能不能 修改UIAlertController 的圆角度数呢?我现在字体颜色都修改了,只是圆角弧度需要小点
      • 0c476cf24b0e:我想问问楼主,这样做或者利用runtime,在苹果审核的时候有被拒风险吗
      • iYeso:这个KVC和runtime用的好
      • ylgwhyh:这个在iPhone5上面会崩溃
        setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key _titleTextColor.'
        只是发给大家伙看看哈
      • b4067f4d3883:请问kvc直接使用那些key 值上架会不会被拒,使用私有API这类原因
      • Mt丶Jean:iOS8下会Crash
      • Roader:感觉如果你用class_copy_Ivar查找到了这个成员变量,那么KVC设值之前并不需要加判断吧?
      • xiaoliuTX_iOS:调试的时候打印alertAction对象,控制台左侧的窗口下面就可以看到他的所有属性了。何必那么麻烦获取varlist
      • luzsyn:求教:UIAlertAction的title内容很长很长的话,字体会自动缩小,怎么处理啊?
      • 0无敌小宋0:用这个,不适合7的系统吧
      • 蒋昉霖:能否留下QQ,设置无效呢
      • 神秘嘉宾yzj:666666,kvc强行更改
      • Reus丶你是我的梦想啊:if (alertController valueForKey:@"attributedTitle") {
        [alertController setValue:alertControllerStr forKey:@"attributedTitle"];
        } 这里应该是 if(![alertController valueForKey:@"attributedTitle"]) {} ;
      • 沐暮风:if (alertController valueForKey:@"attributedMessage") 这个判断应该是不正确的。因为判断attributedMessage的value有可能未空,然后判断进不去,应该是判断alertController是否有这个属性。然后再kvo设置值。不知道这样说对不
      • 5ad4db95da2d:你好,能把 取消/确认按钮字体样式变为自定义的吗?不要系统的 最近公司需求,将确认、取消按钮按钮字体换为自己的,谢谢
      • 4b1b4899b759:如果加判断的话就会不执行里面的代码,去掉判断就可以改变颜色了。key值是“titleTextColor”或者“_titleTextColor”都可以改变颜色。
        wincalling:正解
      • 可恶:if (cancelAction valueForKey:@"titleTextColor") {
        [cancelAction setValue:[UIColor redColor] forKey:@"titleTextColor"];
        }这个if判断不执行怎么办?直接写setValue forKey又怕崩溃
        比利王:@968618715750 if去掉直接写在@try里
        咔客:请问下你解决这个问题了吗?
      • 听先生的秘密基地:准确的说我runtime完没用titleTextColor这个key啊。
        title,
        style,
        enabled,
        handler,
        simpleHandler,
        image,
        shouldDismissHandler,
        "_descriptiveText",
        contentViewController,
        keyCommandInput,
        keyCommandModifierFlags,
        "_representer",
        "_isPreferred",
        "_alertController"
        暮雨飞烟:但是确实能修改
      • 和影子玩拳击:楼主,我想问一下,按钮的字体大小key是什么
        墨狂之逸才:http://dongxin.online/2016/05/15/%E4%BF%AE%E6%94%B9UIAlertAction%E7%9A%84%E5%AD%97%E4%BD%93%E9%A2%9C%E8%89%B2%E5%92%8C%E5%A4%A7%E5%B0%8F/这里说:修改字体大小则需要创建一个UILabel的类目。有其他方法吗?
        和影子玩拳击:@Kuroky09 没
        b7cccc10e2eb:@和影子玩拳击 同问,你解决了吗
      • 张梓辰:楼主,你好帅
      • 21593bb673fb:我的颜色怎么设置不上?
      • 21593bb673fb:你好,方便加一个QQ吗?
      • 秋天的田野:@天空中的球,这样写[cancelAction setValue:[UIColor blackColor] forKey:@"titleTextColor"];也可以
        天空中的球:@秋天的田野 建议使用“_titleTextColor”, 因为当我们查看 UIAlertAction的属性列表中并没有它,“_titleTextColor”是的它的成员变量列表中的一员。
      • 天空中的球:在UIAlertAction中 ,这样才是对的
        [cancelAction setValue:[UIColor blackColor] forKey:@"_titleTextColor"];
        简单程序媛:@Warrior_Seven 同问。_titleTextColor 这个私有属性是 iOS 8.3才出来的,所以在 iOS 8.3 之前使用这个方法都会造成崩溃,求问大神有没有其他方法设置cancelAction的颜色?
        Warrior_Seven:在iOS 8.2中 这句话直接崩溃了,说找不到键值对,不知怎么回事,求大神解答一下,谢谢了
        PlutoMa:@天空中的球 这不就是在UIAlertAction中么
      • 42e1c79aee08:这个键值,具体怎么得到的呀?求教
        2de0e25dd892:@不要安逸的过 通过运行时获取KEY
        PlutoMa:@不要安逸的过 https://git.coding.net/MDMPluto/GetClassInfo.git
      • 3a93b6ca03e3:关键值我用attributedMessage不行,要用message才行,不过在if里面要用attributedMessage,这是什么原因?
        b4deb7b8ea6c:@烏先森 判断该key是否有属性值,默认该属性是没值的。所以要想正确设置,不应有这句判断
        PlutoMa:@烏先森 什么意思,没懂
      • bfc0d4ef4d91:您好,我是新手,我在一个群里说起下面这句代码的时候,就是“[alertController setValue:alertControllerStr forKey:@"attributedTitle"];”这句。有人说可能涉及到私有API,请教会有这个问题吗?
        还有就是我不太知道怎么通过“class_copyIvarList”去找到key值?
        谢谢啊~~
        Louis_hey:@AaronLee77 打断点调试也可以看到的
        bfc0d4ef4d91:@PlutoMa 哦~~谢谢啊~~
        PlutoMa:这个和私有api没关系啊。第二个问题你可以去看一下runtime
      • OnepPieceD:求key值是怎么的得到的 :+1:
        OnepPieceD:哦哦,谢谢啦
        PlutoMa:class_copyIvarList

      本文标题:[iOS]改变UIAlertController的标题、内容的字

      本文链接:https://www.haomeiwen.com/subject/ugfrlttx.html