119 lines
3.5 KiB
Swift
119 lines
3.5 KiB
Swift
//
|
|
// UIButton+VPAdd.swift
|
|
// Veloria
|
|
//
|
|
// Created by Veloria on 2025/5/22.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
extension UIButton {
|
|
fileprivate struct AssociatedKeys {
|
|
static var vp_gradientLayer: Int?
|
|
static var vp_gradientBorder: Int?
|
|
static var vp_gradientBorderShapeLayer: Int?
|
|
}
|
|
|
|
|
|
@objc public static func vp_Awake() {
|
|
vp_swizzled_instanceMethod("vp", oldClass: self, oldSelector: "layoutSubviews", newClass: self)
|
|
}
|
|
|
|
@objc func vp_layoutSubviews() {
|
|
vp_layoutSubviews()
|
|
vp_gradientLayer?.frame = self.bounds
|
|
|
|
vp_gradientBorder?.frame = self.bounds
|
|
let path = UIBezierPath(roundedRect: bounds.insetBy(dx: 2, dy: 2), cornerRadius: layer.cornerRadius)
|
|
vp_gradientBorderShapeLayer?.path = path.cgPath
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
extension UIButton {
|
|
private var vp_gradientLayer: CAGradientLayer? {
|
|
get {
|
|
return objc_getAssociatedObject(self, &AssociatedKeys.vp_gradientLayer) as? CAGradientLayer
|
|
}
|
|
set {
|
|
objc_setAssociatedObject(self, &AssociatedKeys.vp_gradientLayer, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
|
}
|
|
}
|
|
|
|
private var vp_gradientBorder: CAGradientLayer? {
|
|
get {
|
|
return objc_getAssociatedObject(self, &AssociatedKeys.vp_gradientBorder) as? CAGradientLayer
|
|
}
|
|
set {
|
|
objc_setAssociatedObject(self, &AssociatedKeys.vp_gradientBorder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
|
}
|
|
}
|
|
|
|
private var vp_gradientBorderShapeLayer: CAShapeLayer? {
|
|
get {
|
|
return objc_getAssociatedObject(self, &AssociatedKeys.vp_gradientBorderShapeLayer) as? CAShapeLayer
|
|
}
|
|
set {
|
|
objc_setAssociatedObject(self, &AssociatedKeys.vp_gradientBorderShapeLayer, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
|
}
|
|
}
|
|
|
|
///设置渐变色
|
|
func vp_setGradient() {
|
|
if vp_gradientLayer == nil {
|
|
let gLayer = CAGradientLayer()
|
|
gLayer.colors = [UIColor.color05CEA0().cgColor, UIColor.color7C174F().cgColor]
|
|
gLayer.locations = [0, 0.8]
|
|
gLayer.startPoint = .init(x: 0, y: 0.3)
|
|
gLayer.endPoint = .init(x: 1, y: 0.8)
|
|
vp_gradientLayer = gLayer
|
|
}
|
|
|
|
if let layer = vp_gradientLayer {
|
|
self.layer.addSublayer(layer)
|
|
self.titleLabel?.layer.zPosition = 1
|
|
}
|
|
}
|
|
|
|
///删除渐变层
|
|
func vp_removeGradient() {
|
|
vp_gradientLayer?.removeFromSuperlayer()
|
|
}
|
|
|
|
|
|
|
|
|
|
///设置渐变边框
|
|
func vp_setGradientBorder() {
|
|
if vp_gradientBorder == nil {
|
|
let gLayer = CAGradientLayer()
|
|
gLayer.colors = [UIColor.color05CEA0().cgColor, UIColor.color7C174F().cgColor]
|
|
gLayer.locations = [0, 0.8]
|
|
gLayer.startPoint = .init(x: 0, y: 0.3)
|
|
gLayer.endPoint = .init(x: 1, y: 0.8)
|
|
|
|
let shapeLayer = CAShapeLayer()
|
|
shapeLayer.lineWidth = 1
|
|
shapeLayer.fillColor = UIColor.clear.cgColor
|
|
shapeLayer.strokeColor = UIColor.black.cgColor
|
|
gLayer.mask = shapeLayer
|
|
|
|
vp_gradientBorderShapeLayer = shapeLayer
|
|
vp_gradientBorder = gLayer
|
|
}
|
|
if let layer = vp_gradientBorder {
|
|
self.layer.addSublayer(layer)
|
|
self.titleLabel?.layer.zPosition = 1
|
|
}
|
|
}
|
|
|
|
///删除渐变边框
|
|
func vp_removeGradientBorder() {
|
|
vp_gradientBorder?.removeFromSuperlayer()
|
|
}
|
|
|
|
|
|
}
|