IOS 10 统一颜色管理和适配深色模式

news2024/9/22 5:34:19

实现分析

像系统那样,给项目中常用的颜色取名字,这里使用扩展语法实现,好处是可以像访问系统颜色那样访问自定义的颜色。

添加依赖

为了能使用16进制的颜色值,这里通过依赖DynamicColor框架来实现

#颜色工具类
#https://github.com/yannickl/DynamicColor
pod "DynamicColor"

还不了解如何使用 CocoaPods 管理依赖的,建议先看前面的文章:IOS 01 CocoaPods 安装与使用

定义颜色

通过扩展UIColor类来实现

import DynamicColor

//iOS中也提供了命名颜色,例如:.systemBackground,但无法更改他的颜色,Android中就可以根据浅色,深色修改命名的颜色,更方便
extension UIColor {
    /// 主色调
    static var primaryColor : UIColor {return DynamicColor(hex: 0xd6271c)}

    /// 暗一点 主色调
    static var primary30 : UIColor {return DynamicColor(hex: 0xa92e29)}

//    #pragma mark - 黑色到白色
    //颜色命名也是很大的问题,关于颜色命名方式讨论:https://www.zhihu.com/question/301985702
    //以下命名后面的数字,没有实际意思
    //后面两位是透明度
    static var blackTransparent88 : UIColor {return DynamicColor(hex: 0x00000088,useAlpha: true)}
    static var buttonTransparent88 : UIColor {return DynamicColor(hex: 0x00000088,useAlpha: true)}
    static var transparent88 : UIColor {return DynamicColor(hex: 0x88888888,useAlpha: true)}
    static var black11 : UIColor {return DynamicColor(hex: 0xbbbbbb)}
    static var black15 : UIColor {return DynamicColor(hex: 0x111111)}
    static var black17 : UIColor {return DynamicColor(hex: 0x151515)}
    static var black20 : UIColor {return DynamicColor(hex: 0x161616)}
    static var black25 : UIColor {return DynamicColor(hex: 0x191919)}
    static var black30 : UIColor {return DynamicColor(hex: 0x111111)}
    static var black31 : UIColor {return DynamicColor(hex: 0x1b1b1b)}
    static var black311 : UIColor {return DynamicColor(hex: 0x1c1c1c)}
    static var black312 : UIColor {return DynamicColor(hex: 0x1e1e1e)}
    static var black32 : UIColor {return DynamicColor(hex: 0x202020)}
    static var black33 : UIColor {return DynamicColor(hex: 0x242424)}
    static var black322 : UIColor {return DynamicColor(hex: 0x212121)}
    static var black40 : UIColor {return DynamicColor(hex: 0x353535)}
    static var black42 : UIColor {return DynamicColor(hex: 0x353535)}
    static var black43 : UIColor {return DynamicColor(hex: 0x313131)}
    static var black45 : UIColor {return DynamicColor(hex: 0x3c3c3c)}
    static var black66 : UIColor {return DynamicColor(hex: 0x666666)}
    static var black70 : UIColor {return DynamicColor(hex: 0x707070)}
    static var black80 : UIColor {return DynamicColor(hex: 0x888888)}
    static var black90 : UIColor {return DynamicColor(hex: 0xaaaaaa)}
    static var black130 : UIColor {return DynamicColor(hex: 0xc8c8c8)}
    static var black140 : UIColor {return DynamicColor(hex: 0xcfcfcf)}
    static var black150 : UIColor {return DynamicColor(hex: 0xe5e5e5)}
    static var black160 : UIColor {return DynamicColor(hex: 0xd5d5d5)}
    static var black165 : UIColor {return DynamicColor(hex: 0xd1d1d1)}
    static var black170 : UIColor {return DynamicColor(hex: 0xe1e1e1)}
    static var black180 : UIColor {return DynamicColor(hex: 0xededed)}
    static var black183 : UIColor {return DynamicColor(hex: 0xf5f5f5)}
    static var black190 : UIColor {return DynamicColor(hex: 0xf6f6f6)}

    /// 链接颜色
    static var link : UIColor {return DynamicColor(hex: 0x2440b3)}

    /// 主色调,暗一点按钮颜色
    static var primaryButton : UIColor {return DynamicColor(hex: 0x596c94)}

    /// vip金色
    static var vipBorder : UIColor {return DynamicColor(hex: 0xc4b2ad)}

    static var divider2 : UIColor {return DynamicColor(hex: 0x484848)}

    /// 亮灰色,例如:设置item右侧图标,右侧更多文本颜色
    static var lightGray : UIColor {return DynamicColor(hex: 0x888888)}

    /// 错误警告颜色,主要是做敏感操作,例如:删除联系人时,确认按钮颜色
    static var warning : UIColor {return DynamicColor(hex: 0xf85353)}

    /// 优惠券文本颜色
    static var textPrice : UIColor {return DynamicColor(hex: 0xf42102)}

    /// 绿色,表示正确颜色
    static var pass : UIColor {return DynamicColor(hex: 0x0ab855)}
}

定动态颜色

为了能适配深色模式,创建动态颜色,通过initColor方法,根据当前手机的主题颜色返回对应模式适配的颜色,如:当前手机为深色模式,则返回定义的深色模式的颜色值。

extension UIColor{
    /// 主色调
    static var colorPrimary: UIColor {
        return .initColor(normal: .primaryColor, dark: .primary30)
    }

    /// 背景色
    static var colorBackground: UIColor {
        return .initColor(normal: .black183, dark: .black17)
    }


    static var colorBackgroundLight: UIColor {
        return .initColor(normal: .white, dark: .black17)
    }

    /// 背景色上面内容颜色
    static var colorOnBackground: UIColor {
        return .initColor(normal: .black20, dark: .black140)
    }

    /// 背景色上面内容背景颜色,例如card背景,会话界面item背景,其他的例如LinearLayout这样的控件,需要手动指定使用该属性
    static var colorSurface: UIColor {
        return .initColor(normal: .white, dark: .black33)
    }

    /// colorSurface点击颜色
    static var colorSurfaceClick: UIColor {
        return .initColor(normal: .black130, dark: .black322)
    }

    /// colorSurface上面的主内容颜色,例如:card上面主要内容颜色,会话界面item上面标题颜色
    static var colorOnSurface: UIColor {
        return .initColor(normal: .black25, dark: .black165)
    }

    static var colorDivider: UIColor {
        return .initColor(normal: .black180, dark: .black33)
    }

    static var colorDivider2: UIColor {
        return .initColor(normal: .black170, dark: .black30)
    }

    static var colorSlideBackground: UIColor {
        return .initColor(normal: .black170, dark: .black17)
    }

    static var colorLightWhite: UIColor {
        return .initColor(normal: .white, dark: .black180)
    }

    static var secondButtonLight: UIColor {
        return .initColor(normal: .white, dark: .black45)
    }

    /// 文本消息左侧背景
    static var leftChatBackground: UIColor {
        return .initColor(normal: .black170, dark: .black17)
    }

    /// 文本消息右侧背景
    static var rightChatBackground: UIColor {
        return .initColor(normal: .colorPrimary, dark: .colorPrimary)
    }

    // MARK: - 颜色定义快捷方法

    /// 定义浅色,深色颜色快捷方法
    /// - Returns: <#description#>
    static func initColor(normal:UIColor,dark:UIColor) -> UIColor {
        if #available(iOS 13.0, *) {
            return UIColor { (traitCollection) -> UIColor in
                return traitCollection.userInterfaceStyle == .dark ? dark : normal
            }
        }else{
            //用浅色
            return normal
        }
    }
}

使用

设置所有界面背景颜色,如果某个界面不一样,但具体界面单独设置:

//默认颜色,如果某些界面不一样,在单独设置
view.backgroundColor = .colorBackground

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美国洛杉矶大带宽服务器安全与权限

美国洛杉矶的大带宽服务器因其优越的地理位置、高速稳定的网络连接、丰富的资源以及强大的计算能力而受到众多企业和个人用户的青睐。尤其是在网络安全和权限管理方面&#xff0c;洛杉矶的大带宽服务器更是表现突出。下面我们就来详细了解一下这些服务器在安全与权限方面的特点…

Linux配置Maven环境

目录 一、Linux配置Maven环境1.1 挑选Maven版本1.2 下载到linux服务器1.3 解压1.4 配置环境变量1.5 测试 一、Linux配置Maven环境 1.1 挑选Maven版本 官网地址&#xff1a;https://maven.apache.org/download.cgi 这里以当前最新版本3.9.8为例 获取其对应的下载链接&#xf…

人工智能的新兴能力:我们是在追逐神话吗

图片由作者使用 DALL-E 拍摄 模型的涌现属性 突现属性不仅是人工智能的一个概念&#xff0c;也是所有学科&#xff08;从物理学到生物学&#xff09;的一个概念。这一概念一直让科学家着迷&#xff0c;他们既在描述这一概念&#xff0c;也在试图理解其起源。诺贝尔物理学奖得…

bootchart抓Android系统启动各阶段性能数据

最近在做Android系统启动优化&#xff0c;首要任务是找到启动过程中各阶段耗时点&#xff0c;进而有针对性地进行优化。主要用bootchart抓开机数据&#xff0c;本文主要记录下工具的使用方法。 1.抓开机数据 adb root adb shell ‘touch /data/bootchart/enabled’ adb rebo…

HDFS的透明加密

一、HDFS透明加密原理 Hadoop的透明加密(HDFS Transparent Data Encryption) - TDE 1.HDFS中的数据明文存储 HDFS中的数据会以block的形式保存在各台数据节点的本地磁盘中,但这些block都是明文的。 通过Web UI页面找到Block的ID和副本位于的机器信息 如果在操作系统中直接访…

2024年运营技术与网络安全态势研究报告:遭遇多次网络威胁的比例暴增

随着 OT 组织不断在其业务环境中集成各种数字工具和技术&#xff0c;它们面临的安全挑战也日益变得愈加复杂和多样化。正如 NIST 指出&#xff0c; “虽然安全解决方案旨在解决典型 IT系统中的一些问题&#xff0c;但将这些相同的解决方案引入不同的 OT 环境时&#xff0c;必须…

excel实现图片转文字功能/excel 实现导出图片功能/excel导出图片不失真(解决excel导出图片模糊的问题)

excel实现图片转文字功能 excel实现图片转文字功能&#xff1a;方法1&#xff1a;使用QQ的在线文档进行图片转文字方法2&#xff1a;使用WPS的excel文档进行图片转文字pdf图片转表格 使用excel 导出图片的方法&#xff08;使用Excel内置的“复制为图片”功能&#xff09;1. 复制…

Java序列化流和反序列化流

序列化流&#xff1a; 序列化&#xff1a;将一个对象转换成网络中传输的流 对象输出流&#xff1a;ObjectOutputStream 反序列化&#xff1a;将网络中传输的流还原成一个对象 对象输入流&#xff1a;ObjectInputStream 一个类对象将来…

轻松上手MYSQL:MYSQL权限配置全攻略,打造安全的数据库环境

​ &#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索MYSQL权限配置之旅✨ &#x1f44b; 大家好&#xff01;文本学习和…

【秋招笔试】8.14联想(算法岗)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

Cortex-A7的GIC(全局中断控制器)使用方法(6):基于stm32MP135的IRQ初始化及处理流程分析

0 参考资料 STM32MP13xx参考手册.pdf&#xff08;RM0475&#xff09; ARM Generic Interrupt Controller Architecture version 2.0 - Architecture Specification.pdf 1 基于Cortex-A7的STM32MP135的IRQ初始化及处理流程分析 熟悉基于Cortex-M内核的stm32系列MCU的一定对中断…

RabbitMQ练习(Hello World)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials RabbitMQ是一个消息代理&#xff0c;它接受并转发消息。你可以将其想象成一个邮局&#xff1a;当你将需要邮寄的信件放入邮筒时&#xff0c;你可以确信邮递员最终会将邮件投递给你的收件人。在这个…

LDR6500-type-c 接口小封装PD取电协议芯片

LDR6500 Type-C PD取电芯片是一种基于Type-C接口的电源传输的协议芯片&#xff0c;它通过Type-C接口中的CC&#xff08;Configuration Channel&#xff09;线进行通信&#xff0c;协商电压、电流及供电方向。当设备连接时&#xff0c;双方会进行握手通信&#xff0c;以确定彼此…

在AMD GPU上进行Grok-1模型的推理

Inferencing with Grok-1 on AMD GPUs — ROCm Blogs 我们展示了如何通过利用ROCm软件平台&#xff0c;能在AMD MI300X GPU加速器上无缝运行xAI公司的Grok-1模型。 介绍 xAI公司在2023年11月发布了Grok-1模型&#xff0c;允许任何人使用、实验和基于它构建。Grok-1的不同之处…

Java学习Day29:查漏补缺

1.只创建对象不创建文件 2.过滤器 使用匿名内部类实现FileFilter接口&#xff0c;实现过滤&#xff1b; 递归实现遍历目录及子目录下的后缀为。txt文件 public class ioRee {public static void main(String[] args) throws IOException {File file new File("D:\\A&quo…

pywebview 入门

pywebview 入门 文档地址 地址 https://pywebview.flowrl.com/guide/ 一、pywebview 简介 1. 什么是 pywebview&#xff1f; pywebview 是一个轻量级的 python 库&#xff0c;旨在简化桌面应用程序的开发。它利用系统的 WebView 组件&#xff0c;使得开发人员可以使用现代 …

web过滤器,前后端同步异步交互,跨域问题,json等知识点

一.过滤器 (1)什么是过滤器 过滤器(Filter)&#xff1a;是web服务器管理所有的web资源例如servlet,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等。 (2)过滤器的作用 通过过滤器可以实现对服务器web资源的拦截&#xff0c;例如编码过滤器通过对web资源的过滤拦截可以实…

python-素数回文(赛氪OJ)

[题目描述] 现在给出一个素数&#xff0c;这个素数满足两点&#xff1a; 1、 只由 1∼9 组成&#xff0c;并且每个数只出现一次&#xff0c;如 13,23,1289 。 2、 位数从高到低为递减或递增&#xff0c;如 2459,87631 。 请你判断一下&#xff0c;这个素数的回文数是否为素数&a…

python之matplotlib (1 介绍及基本用法)

介绍 matplotlib是Python中的一个绘图库&#xff0c;它提供了一个类似于 MATLAB 的绘图系统。使用matplotlib你可以生成图表、直方图、功率谱、条形图、错误图、散点图等。matplotlib广泛用于数据可视化领域&#xff0c;是 Python 中最著名的绘图库之一。 同样matplotlib的安…

day23-测试自动化之Appium的滑动和拖拽事件、高级手势ActionChains、手机操作API

目录 一、滑动和拖拽事件 1.1.应用场景 1.2.swipe滑动事件 1.3.scroll滑动事件 1.4.drag_and_drop拖拽事件 1.5.滑动和拖拽事件的选择 二、高级手势ActionChains 2.1.应用场景 2.2.使用步骤 2.3.注意点 2.4.方法 1).手指轻敲操作 (掌握) 2).手势按下和抬起操作(掌握&#xff0…