Veloria/Veloria/Base/Extension/UIButton+VPAdd.swift

119 lines
3.6 KiB
Swift

//
// UIButton+VPAdd.swift
// Veloria
//
// Created by Veloria on 2025/5/22.
//
import UIKit
extension UIButton {
fileprivate struct AssociatedKeys {
static var bt_gradientLayer: Int?
static var bt_gradientBorder: Int?
static var bt_gradientBorderShapeLayer: Int?
}
@objc public static func vp_bt_Awake() {
vp_swizzled_instanceMethod("vp_bt", oldClass: self, oldSelector: "layoutSubviews", newClass: self)
}
@objc func vp_bt_layoutSubviews() {
vp_bt_layoutSubviews()
bt_gradientLayer?.frame = self.bounds
bt_gradientBorder?.frame = self.bounds
let path = UIBezierPath(roundedRect: bounds.insetBy(dx: 0.5, dy: 0.5), cornerRadius: layer.cornerRadius)
bt_gradientBorderShapeLayer?.path = path.cgPath
}
}
extension UIButton {
private var bt_gradientLayer: CAGradientLayer? {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.bt_gradientLayer) as? CAGradientLayer
}
set {
objc_setAssociatedObject(self, &AssociatedKeys.bt_gradientLayer, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
private var bt_gradientBorder: CAGradientLayer? {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.bt_gradientBorder) as? CAGradientLayer
}
set {
objc_setAssociatedObject(self, &AssociatedKeys.bt_gradientBorder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
private var bt_gradientBorderShapeLayer: CAShapeLayer? {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.bt_gradientBorderShapeLayer) as? CAShapeLayer
}
set {
objc_setAssociatedObject(self, &AssociatedKeys.bt_gradientBorderShapeLayer, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
///
func bt_setGradient() {
if bt_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)
bt_gradientLayer = gLayer
}
if let layer = bt_gradientLayer {
self.layer.addSublayer(layer)
self.titleLabel?.layer.zPosition = 1
}
}
///
func bt_removeGradient() {
bt_gradientLayer?.removeFromSuperlayer()
}
///
func bt_setGradientBorder() {
if bt_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
bt_gradientBorderShapeLayer = shapeLayer
bt_gradientBorder = gLayer
}
if let layer = bt_gradientBorder {
self.layer.addSublayer(layer)
self.titleLabel?.layer.zPosition = 1
}
}
///
func bt_removeGradientBorder() {
bt_gradientBorder?.removeFromSuperlayer()
}
}