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)
    }
}
相关推荐
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读5 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
C语言小火车5 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁5 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超5 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int5 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++
CoderYanger5 天前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
茶底世界之下5 天前
为什么预览、录制、离线导出不能共享同一个背压策略?
ios·swift
2501_916007476 天前
苹果商店iOS应用上架费用全面解析:开发者计划与审核费用计算
android·ios·小程序·https·uni-app·iphone·webview
伞伞悦读6 天前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json