美文网首页
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