Veloria/Veloria/Base/Extension/UIButton+VPAdd.swift
2025-05-22 15:06:33 +08:00

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()
}
}