Swift Control View,Label渐变颜色(源码)

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

要用frame约束方式

文章目录

使用

参数说明

参数说明:

colors: 颜色数组

locations:控制颜色过渡的位置

startPoint: 渐变起点

endPoint: 渐变终点

注意:颜色数组有3个颜色,控制颜色过渡的位置数组对应要有3个参数,渐变起点就是颜色于颜色过渡的位置

坐标系说明

bash 复制代码
(0,0) ─────────── (1,0)
  │                  │
  │    UIView        │
  │                  │
(0,1) ─────────── (1,1)

View - 示例代码

bash 复制代码
let box = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 100))
box.az_setGradientBackground(
    colors: [UIColor.red, UIColor.blue],
    locations: [0.0, 1.0],
    startPoint: CGPoint(x: 0, y: 0.5),
    endPoint: CGPoint(x: 1, y: 0.5)
)
view.addSubview(box)
box.center = view.center

效果

Label - 示例代码

bash 复制代码
let label = GradientLabel()
label.frame = CGRect(x: 50, y: 100, width: 300, height: 60)
label.text = "渐变文字效果"
label.font = UIFont.boldSystemFont(ofSize: 30)
label.textAlignment = .center

// 设置渐变(通过关联属性)
label.az_colors = [UIColor.systemPink.cgColor, UIColor.systemPurple.cgColor]
label.az_locations = [0.0, 1.0]
label.az_startPoint = CGPoint(x: 0, y: 0.5)
label.az_endPoint = CGPoint(x: 1, y: 0.5)

view.addSubview(label)
label.center = view.center

效果

封装代码

GradientLabel

bash 复制代码
import UIKit

class GradientLabel: UILabel {

    override class var layerClass: AnyClass {
        return CAGradientLayer.self
    }
}

GradientView

bash 复制代码
import UIKit

class GradientView: UIView {

    override class var layerClass: AnyClass {
        return CAGradientLayer.self
    }
}

UIView+AZGradient

bash 复制代码
import UIKit
import ObjectiveC.runtime

private var azColorsKey: UInt8 = 0
private var azLocationsKey: UInt8 = 0
private var azStartPointKey: UInt8 = 0
private var azEndPointKey: UInt8 = 0

extension UIView {

    // MARK: - Associated Properties

    var az_colors: [CGColor]? {
        get {
            return objc_getAssociatedObject(self, &azColorsKey) as? [CGColor]
        }
        set {
            objc_setAssociatedObject(self, &azColorsKey, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)
            if let layer = self.layer as? CAGradientLayer {
                layer.colors = newValue
            }
        }
    }

    var az_locations: [NSNumber]? {
        get {
            return objc_getAssociatedObject(self, &azLocationsKey) as? [NSNumber]
        }
        set {
            objc_setAssociatedObject(self, &azLocationsKey, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)
            if let layer = self.layer as? CAGradientLayer {
                layer.locations = newValue
            }
        }
    }

    var az_startPoint: CGPoint {
        get {
            return (objc_getAssociatedObject(self, &azStartPointKey) as? NSValue)?.cgPointValue ?? .zero
        }
        set {
            objc_setAssociatedObject(self, &azStartPointKey, NSValue(cgPoint: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            if let layer = self.layer as? CAGradientLayer {
                layer.startPoint = newValue
            }
        }
    }

    var az_endPoint: CGPoint {
        get {
            return (objc_getAssociatedObject(self, &azEndPointKey) as? NSValue)?.cgPointValue ?? .zero
        }
        set {
            objc_setAssociatedObject(self, &azEndPointKey, NSValue(cgPoint: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            if let layer = self.layer as? CAGradientLayer {
                layer.endPoint = newValue
            }
        }
    }

    // MARK: - 创建渐变View
    static func az_gradientView(
        colors: [UIColor]?,
        locations: [NSNumber]?,
        startPoint: CGPoint,
        endPoint: CGPoint
    ) -> UIView {

        let view = GradientView()
        view.az_setGradientBackground(colors: colors,
                                      locations: locations,
                                      startPoint: startPoint,
                                      endPoint: endPoint)
        return view
    }

    // MARK: - 设置渐变
    func az_setGradientBackground(
        colors: [UIColor]?,
        locations: [NSNumber]?,
        startPoint: CGPoint,
        endPoint: CGPoint
    ) {

        guard let colors = colors else { return }

        let gradient = CAGradientLayer()
        gradient.colors = colors.map { $0.cgColor }
        gradient.locations = locations
        gradient.startPoint = startPoint
        gradient.endPoint = endPoint
        gradient.frame = self.bounds
        
        gradient.cornerRadius = self.layer.cornerRadius

        self.layer.insertSublayer(gradient, at: 0)
    }
}
相关推荐
白帽攻防录6 小时前
SRC 挖洞:PostScript 打印机驱动双 RCE,打印服务器怎么变成内网跳板
开发语言·网络安全·php·内网安全
十年Java程序媛6 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
2603_965148116 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
xixiaoyunya7 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
学逆向的7 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
小坏讲微服务8 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
打工仔折腾 AI9 小时前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战
MATLAB代码顾问9 小时前
Simulink PI 参数扫描与批量仿真完整 MATLAB 代码
开发语言·matlab
Want59510 小时前
Python跳动的爱心②
开发语言·python·数学建模
小羊没烦恼!11 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html