美文网首页iOSiOS分享的demo博客积累
UIAlertController 简单修改title以及按钮的

UIAlertController 简单修改title以及按钮的

作者: 青春微凉来时路 | 来源:发表于2016-08-05 10:20 被阅读4620次

    欢迎加入 iOS开发QQ群:151133690

    实现此效果的另一种简单调用方式已经上传到gitHub,请移步https://github.com/benben-hello/BBAlertController

    先来几张效果图吧:

    修改按钮颜色.PNG 修改标题颜色.PNG 修改按钮和标题的颜色.PNG

    苦逼的开发者,最终败给了一个任性的UI,系统原生UIAlertController的按纽颜色必须改.于是,开始了不归路.
    之前的版本是自己用view写的一个仿系统UIActionSheet,动画感觉都挺好,就是毛玻璃背景没有系统的好,由于最低兼容了ios8,所以就抛弃了UIActionSheet,改用UIAlertController.

    做法其实很简单,采用runtime机制.对于runtime不了解的,我想还是别看各种介绍文章了,找一个简单的demo多写几遍,就行了.

    做法很简单,自己写一个类 继承自UIAlertController,还是先把.h和.m的代码都给大家吧.

    SCAlertController.h

    //
    //  SCAlertController.h
    //  SCAlertController
    //
    //  Created by it3部01 on 16/8/3.
    //  Copyright © 2016年 benben. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    @interface SCAlertAction : UIAlertAction
    
    @property (nonatomic,strong) UIColor *textColor; /**< 按钮title字体颜色 */
    
    @end
    
    @interface SCAlertController : UIAlertController
    
    @property (nonatomic,strong) UIColor *tintColor; /**< 统一按钮样式 不写系统默认的蓝色 */
    @property (nonatomic,strong) UIColor *titleColor; /**< 标题的颜色 */
    @property (nonatomic,strong) UIColor *messageColor; /**< 信息的颜色 */
    
    @end
    

    SCAlertController.m

    //
    //  SCAlertController.m
    //  SCAlertController
    //
    //  Created by it3部01 on 16/8/3.
    //  Copyright © 2016年 benben. All rights reserved.
    //
    
    #import "SCAlertController.h"
    #import <objc/runtime.h>
    
    @implementation SCAlertAction
    
    //按钮标题的字体颜色
    -(void)setTextColor:(UIColor *)textColor
    {
        _textColor = textColor;
        
        unsigned int count = 0;
        Ivar *ivars = class_copyIvarList([UIAlertAction class], &count);
        for(int i =0;i < count;i ++){
            
            Ivar ivar = ivars[i];
            NSString *ivarName = [NSString stringWithCString:ivar_getName(ivar) encoding:NSUTF8StringEncoding];
            
            if ([ivarName isEqualToString:@"_titleTextColor"]) {
                
                [self setValue:textColor forKey:@"titleTextColor"];
            }
        }
    }
    
    @end
    
    
    @implementation SCAlertController
    
    -(void)viewDidLoad
    {
        [super viewDidLoad];
        
        unsigned int count = 0;
        Ivar *ivars = class_copyIvarList([UIAlertController class], &count);
        for(int i = 0;i < count;i ++){
            
            Ivar ivar = ivars[i];
            NSString *ivarName = [NSString stringWithCString:ivar_getName(ivar) encoding:NSUTF8StringEncoding];
            
            //标题颜色
            if ([ivarName isEqualToString:@"_attributedTitle"] && self.title && self.titleColor) {
    
                NSMutableAttributedString *attr = [[NSMutableAttributedString alloc]initWithString:self.title attributes:@{NSForegroundColorAttributeName:self.titleColor,NSFontAttributeName:[UIFont boldSystemFontOfSize:14.0]}];
                [self setValue:attr forKey:@"attributedTitle"];
            }
            
            //描述颜色
            if ([ivarName isEqualToString:@"_attributedMessage"] && self.message && self.messageColor) {
                
                NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:self.message attributes:@{NSForegroundColorAttributeName:self.messageColor,NSFontAttributeName:[UIFont systemFontOfSize:14.0]}];
                [self setValue:attr forKey:@"attributedMessage"];
            }
        }
        
        //按钮统一颜色
        if (self.tintColor) {
            for (SCAlertAction *action in self.actions) {
                if (!action.textColor) {
                    action.textColor = self.tintColor;
                }
            }
        }
    }
    
    @end
    
    

    一般来说对于SCAlertController里面的属性应该像SCAlertAction一样放在setter方法里面修改,这里我表示为了方便就放在这个方法里面了.

    -(void)viewDidLoad
    {
        [super viewDidLoad];   
    }
    

    用法就很简单了,和系统原生UIAlertController一样,只是把UI换成SC,当然你可以改成自己喜欢的,但是别忘了改完.

    SCAlertController *alertController = [SCAlertController alertControllerWithTitle:@"你确定要退出吗?" message:nil preferredStyle:UIAlertControllerStyleActionSheet];
            alertController.tintColor = [UIColor redColor]; //这里统一设置各个按钮的颜色都为红色.
    当然,你还可以自定义某一个按钮的颜色.比如下面的取消按钮
            alertController.titleColor = [UIColor redColor];
            
            //取消
            SCAlertAction *cancelAction = [SCAlertAction actionWithTitle:@"我不想退出" style:UIAlertActionStyleCancel handler:nil];
           
            //单独修改一个按钮的颜色
            cancelAction.textColor = [UIColor greenColor];
            [alertController addAction:cancelAction];
            
            //退出
            SCAlertAction *exitAction = [SCAlertAction actionWithTitle:@"退出" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
               
            }];
            [alertController addAction:exitAction];
            
            [self presentViewController:alertController animated:YES completion:nil];
        }
    

    相关文章

      网友评论

      • 梁景华Joshua_:如果能把UIAlertController封装成block,是不是会更好呢。
        青春微凉来时路:@梁景华Joshua_ 简单写了一个 http://www.jianshu.com/p/e76300359457
        梁景华Joshua_:@青春微凉来时路 :scream: 太恐怖的996。坐等大神神作。
        青春微凉来时路:@梁景华Joshua_ 经历了两月的九九六 待满血复活之后再研究 :smile:
      • 5165c4cbb221:取消与退出按钮的颜色改变不了。。。。。
      • seasonZhu:大神,我们公司需求需要在“你确定退出么”的左上角添加一个小红点,不知道这个如何处理,希望能够指导一下,谢谢!
        seasonZhu:有空我上电脑截图一个。
        seasonZhu:@青春微凉来时路 也想到了贴一个imageView贴在上面,关键是贴的控件,如何布局?
        青春微凉来时路:@叆叇云逝 具体什么需求呢? 实在不行自定义一个view 贴上面 :smiley:
      • YIC911:收下了,谢谢
      • 巴糖:mark
      • 丶偏执怪人:收下了:kissing_heart:
      • 子达如何:iOS8.2以下的8.0系统并没有这个隐藏属性
        子达如何:@捷风123 说服UI设计师遵循iOS的默认设计,:stuck_out_tongue_winking_eye::stuck_out_tongue_winking_eye:
        捷风:是的,我在8.1的模拟器上面也找不到这个影藏属性,楼主找到好的解决方案了吗? :blush:
        青春微凉来时路:@子达如何 好的,明天会看看
      • 从来吃不胖:有一点没搞懂。为啥要遍历所有属性?既然知道了属性名,直接KVC赋值可以了吧
        青春微凉来时路:@从来吃不胖 这里我试了一下,遍历属性还有一个好处就是当这个属性不存在的时候set 会崩溃,所以为了防止以后系统修改属性名还是遍历加个判断吧 :relaxed:
        从来吃不胖:@青春微凉来时路 嗯嗯。解疑啦哈哈
        青春微凉来时路:@从来吃不胖 额 这是当初查看属性名的时候,直接这么写的,后来没有优化...
      • 是的蛮大人:会涉及到私有API影响AppStore上架吗?
        青春微凉来时路:@是的蛮大人 没有用到私有API ,这里用的是运行时 不影响上架的。

      本文标题:UIAlertController 简单修改title以及按钮的

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