Swift开发应用中如何更方便地使用颜色详解

前言

春节期间做了一款新的产品OneScreen,总结了学习Swift开发以来的一些技巧,今天为大家带来一个方便调取颜色、更好使用颜色、随时修改颜色的技巧。

主要涵盖的内容是:

1.通过扩展,使用十六进制颜色码标记颜色

2.构建自定义的颜色/样式,在各页面中方便调用

3.在后续UI调整中,只需要调整一个文件即可预览全局

实际上,2、3的技巧类似于之前分享过的多主题解决方案。

一、使用十六进制颜色码

在开发OneScreen中,首先创建了ExtensionFile.swift文件,如下的代码可以实现我们后续调用十六进制颜色码。

import Foundation
extension UIColor {
  class func colorWithHexString(hex:String) ->UIColor {
    var cString = hex.trimmingCharacters(in:CharacterSet.whitespacesAndNewlines).uppercased()

    if (cString.hasPrefix("#")) {
      let index = cString.index(cString.startIndex, offsetBy:1)
      cString = cString.substring(from: index)
    }
    if (cString.characters.count != 6) {
      return UIColor.red
    }
    let rIndex = cString.index(cString.startIndex, offsetBy: 2)
    let rString = cString.substring(to: rIndex)
    let otherString = cString.substring(from: rIndex)
    let gIndex = otherString.index(otherString.startIndex, offsetBy: 2)
    let gString = otherString.substring(to: gIndex)
    let bIndex = cString.index(cString.endIndex, offsetBy: -2)
    let bString = cString.substring(from: bIndex)
    var r:CUnsignedInt = 0, g:CUnsignedInt = 0, b:CUnsignedInt = 0;
    Scanner(string: rString).scanHexInt32(&r)
    Scanner(string: gString).scanHexInt32(&g)
    Scanner(string: bString).scanHexInt32(&b)
    return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: CGFloat(1))
  }
}

这样,我们每一次通过UIColor.colorWithHexString(hex: "#______")便可以调用颜色,更快地进行颜色获取。

二、建立自己的颜色

接着,我建立了所有页面中用到的颜色库Theme.swift,直接在文件中创建了所有将用到的颜色,给每个颜色的适当命名也是方便记忆和使用。

import Foundation
import UIKit
struct Theme{
  static var ThemeBlue:UIColor = UIColor.colorWithHexString(hex: "#46b8ee")
  static var ThemeDarkBlue:UIColor = UIColor.colorWithHexString(hex: "#3eb5ed")
  static var ThemeDeepBlue:UIColor = UIColor.colorWithHexString(hex: "#2396cd")
  static var ThemePurple:UIColor = UIColor.colorWithHexString(hex: "#8267c6")
  static var ThemeDarkPurple:UIColor = UIColor.colorWithHexString(hex: "#7963c5")
  static var ThemeDeepPurple:UIColor = UIColor.colorWithHexString(hex: "#7059c5")
  //...
}

三、在各页面中调用

调用的过程很简单,只需要在我们需要UIColor的地方Theme后面直接跟颜色的名称即可,例如:

cell.backgroundColor = Theme.ThemeDeepPurple
cell.backgroundColor = Theme.ThemeDeepBlue

通过两个简单的文件,便可以更快速的获取颜色、自定义颜色。当后续UI调整,需要新增、改变颜色时,我们只需要更改Theme.swift中的代码即可。特别是已经存在的颜色,在其他页面文件中无需做任何更改,便可全部更新为最新颜色。
希望这样的解决方案,能给你的开发提升效率。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Swift 3.0将UILabel数字颜色设置为红色的方法

    实现需求 这篇文章源于群友的一个问题:如何把『注:此商品只能整件(12的倍数发货),已选1袋,还差11袋』这段文字中的数字使用红色在 UILabel 中显示? 实现思路 我们可以使用UILabel 的 attribute string 属性,通过正则表达式匹配获取数字的范围,然后添加对应的 attribute. 实现代码 下面是实现代码,使用 swift 3.0 编写: //根据正则表达式改变文字颜色 func changeTextChange(regex: String, text: Stri

  • Swift开发应用中如何更方便地使用颜色详解

    前言 春节期间做了一款新的产品OneScreen,总结了学习Swift开发以来的一些技巧,今天为大家带来一个方便调取颜色.更好使用颜色.随时修改颜色的技巧. 主要涵盖的内容是: 1.通过扩展,使用十六进制颜色码标记颜色 2.构建自定义的颜色/样式,在各页面中方便调用 3.在后续UI调整中,只需要调整一个文件即可预览全局 实际上,2.3的技巧类似于之前分享过的多主题解决方案. 一.使用十六进制颜色码 在开发OneScreen中,首先创建了ExtensionFile.swift文件,如下的代码可以实

  • 在Vue页面中如何更优雅地引入图片详解

    目录 错误示范 通过computed 当图片不变的时候直接引入 通过css变量切换图片 通过css绘制 总结 在我们写vue项目中肯定会用到各种图片,那么如何更好的使用图片资源呢.这里我讲一下我常用的方法. 错误示范 也许你的代码里常常会这样写 <template> <img :src="src"> </template> <script> export default{ data(){ return { src: require('xx

  • Angular中$cacheFactory的作用和用法实例详解

    先说下缓存: 一个缓存就是一个组件,它可以透明地储存数据,以便以后可以更快地服务于请求.多次重复地获取资源可能会导致数据重复,消耗时间.因此缓存适用于变化性不大的一些数据,缓存能够服务的请求越多,整体系统性能就能提升越多. $cacheFactory介绍: $cacheFactory是一个为Angular服务生产缓存对象的服务.要创建一个缓存对象,可以使用$cacheFactory通过一个ID和capacity.其中,ID是一个缓存对象的名称,capacity则是描述缓存键值对的最大数量. 1.

  • Spring jdbc中数据库操作对象化模型的实例详解

    Spring jdbc中数据库操作对象化模型的实例详解 Spring Jdbc数据库操作对象化 使用面向对象方式表示关系数据库的操作,实现一个线程安全可复用的对象模型,其顶级父类接口RdbmsOperation. SqlOperation继承该接口,实现数据库的select, update, call等操作. 1.查询接口:SqlQuery 1) GenericSqlQuery, UpdatableSqlQuery, MappingSqlQueryWithParameter 2) SqlUpda

  • C++ 中引用和指针的关系实例详解

    C++ 中引用和指针的关系实例详解 1.引用在定义时必须初始化,指针没有要求 int &rNum; //未初始化不能通过编译 int *pNum; //可以 2. 一旦一个引用被初始化为指向一个对象,就不能再指向 其他对象,而指针可以在任何时候指向任何一个同类型对象 int iNum = 10; int iNum2 = 20; int &rNum = iNum; &rNum = iNum2; //不能通过 3. 没有NULL引用,但有NULL指针. int *pNum = NULL

  • Java中map遍历方式的选择问题详解

    1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率.那么实际情况如何呢? 为了解遍历性能的真实差距,包括在遍历key+value.遍历key.遍历value等不同场景下的差异,我试着进行了一些对比测试. 2. 对比测试 一开始只进行了简单的测试,但结果却表明k

  • Android 中ViewPager重排序与更新实例详解

    Android 中ViewPager重排序与更新实例详解 最近的项目中有栏目订阅功能,在更改栏目顺序以后需要更新ViewPager.类似于网易新闻的频道管理. 在重新排序之后调用了PagerAdapter的notifyDataSetChanged方法,发现ViewPager并没有更新,于是我开始跟踪源码,在调用PagerAdapter的notifyDataSetChanged方法后,会触发Viewpager的dataSetChanged方法. void dataSetChanged() { //

  • Java 中DateUtils日期工具类的实例详解

    Java 中DateUtils日期工具类的实例详解 介绍 在java中队日期类型的处理并不方便,通常都需要借助java.text.SimpleDateFormat类来实现日期类型 和字符串类型之间的转换,但是在jdk1.8之后有所改善,jdk1.7以及之前的版本处理日期类型并不方便, 可以借助Joda Time组件来处理,尤其是日期类型的一些数学操作就更是不方便. java代码 /** * * 日期工具类 java对日期的操作一直都很不理想,直到jdk1.8之后才有了本质的改变. * 如果使用的

  • Android 中Crash时如何获取异常信息详解及实例

    Android 中Crash时如何获取异常信息详解 前言: 大家都知道,Android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于Android系统底层的bug,也可能是由于不充分的机型适配或者是糟糕的网络状况.当crash发生时,系统会kill掉你的程序,表现就是闪退或者程序已停止运行,这对用户来说是很不友好的,也是开发者所不愿意看到的,更糟糕的是,当用户发生了crash,开发者却无法得知程序为何crash,即便你想去解决这个crash,

  • python 函数中的内置函数及用法详解

    今天来介绍一下Python解释器包含的一系列的内置函数,下面表格按字母顺序列出了内置函数: 下面就一一介绍一下内置函数的用法: 1.abs() 返回一个数值的绝对值,可以是整数或浮点数等. print(abs(-18)) print(abs(0.15)) result: 18 0.15 2.all(iterable) 如果iterable的所有元素不为0.''.False或者iterable为空,all(iterable)返回True,否则返回False. print(all(['a','b',

随机推荐