美文网首页
Swift颜色和渐变简单封装 2023-10-09 周一

Swift颜色和渐变简单封装 2023-10-09 周一

作者: 松哥888 | 来源:发表于2023-10-08 07:40 被阅读0次

颜色

系统提供的方法

  • 我们用的最多的还是RGBA颜色系统,每个参数都是0到1的浮点数,只是类型是iOS比较独特的CGFloat
public init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)
  • red, green, blue: 取值是0到255之间的某个数,除以255之后的值,相对比较麻烦;

  • 一般UI给的颜色值是16进制的RGB值,比如0x11BA66之类的,再加上一个20%之类的透明度

颜色工具封装

  • 把16进制的整数转化为10进制,并且取出RGB三个分量的值,可以比较方便调用系统方法;
UIColor(red: CGFloat((hexValue & 0xFF0000) >> 16) / 255, green: CGFloat((hexValue & 0x00FF00) >> 8) / 255, blue: CGFloat(hexValue & 0x0000FF) / 255, alpha: alphaValue)
  • 整数的16进制表示也是比较麻烦的,最好是提供一个字符,比较方便;所以需要一个字符串转16进制整数的方法
Scanner(string: hexString).scanHexInt64(&hexValue)
  • 透明度大多数情况是1,这个只要给个默认值就可以解决。最后的样子如下:
    /// 16进制字符串转Color
    public static func hexColor(_ inputString: String?, alpha: CGFloat = 1) -> UIColor {
        // 默认给绿色
        var hexValue: UInt64 = 0x11BA66
        let hexString = inputString ?? "0x11BA66"
        Scanner(string: hexString).scanHexInt64(&hexValue)
        
        // 确保alpha的范围是0到1
        var alphaValue = alpha
        if alphaValue > 1 {
            alphaValue = 1
        }
        if alphaValue < 0 {
            alphaValue = 0
        }
        
        return UIColor(red: CGFloat((hexValue & 0xFF0000) >> 16) / 255, green: CGFloat((hexValue & 0x00FF00) >> 8) / 255, blue: CGFloat(hexValue & 0x0000FF) / 255, alpha: alphaValue)
    }

渐变

系统提供的渐变太灵活了,项目中可以缩小适应范围,比如,只提供垂直方向两种颜色的渐变:

    /// 在背景部分加渐变;需要等frame稳定
    public static func addGradient(_ view: UIView, startColor: UIColor, endColor: UIColor) {
        /// 渐变
        /// https://www.jianshu.com/p/eca222b78a24
        /// 渐变需要加到最底层,如果用addSulayer,会导致渐变加在最顶层,其他视图会被盖住
        let gradientLayer = CAGradientLayer()
        gradientLayer.colors = [startColor.cgColor, endColor.cgColor]
        gradientLayer.frame = view.bounds
        gradientLayer.locations = [0, 1]
        gradientLayer.startPoint = CGPoint(x: 0.5, y: 0)
        gradientLayer.endPoint = CGPoint(x: 0.5, y: 1)
        view.layer.insertSublayer(gradientLayer, at: 0)
    }

由于渐变用到frame参数,所以调用时机需要注意一下,比如viewDidLoad的时候,frame就还不确定,就不适合做渐变相关的事。除非固定frame参数。

相关文章

网友评论

      本文标题:Swift颜色和渐变简单封装 2023-10-09 周一

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