zoukankan      html  css  js  c++  java
  • UIAlertController 简单修改title以及按钮的字体颜色

    https://www.jianshu.com/p/cecd1b4bbf27

    欢迎加入 iOS开发QQ群:151133690

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

    先来几张效果图吧:




    苦逼的开发者,最终败给了一个任性的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];

        }

    作者:青春微凉来时路

    链接:https://www.jianshu.com/p/cecd1b4bbf27

    來源:简书

    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 相关阅读:
    《开源框架那点事儿23》:采用TinyDB组件方式开发
    《开源框架那些事儿22》:UI框架设计实战
    《开源框架那些事儿21》:巧借力与借巧力
    logstash 添加nginx日志
    ossfs 使用挂在到ecs -centos 6.8
    Django JWT Token RestfulAPI用户认证
    install scrapy
    Django 1.9 + celery + django-celry 实现定时任务
    celery
    ansible常用模块用法
  • 原文地址:https://www.cnblogs.com/sundaysgarden/p/10309546.html
Copyright © 2011-2022 走看看