117 lines
4.3 KiB
Swift
117 lines
4.3 KiB
Swift
//
|
|
// FALabel.swift
|
|
// Fableon
|
|
//
|
|
// Created by 湖北秦九 on 2025/10/24.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
class FALabel: UILabel {
|
|
|
|
var textColorImage: UIImage?
|
|
var fa_textColor: UIColor?
|
|
var textColors: [CGColor]?
|
|
var textStartPoint: CGPoint?
|
|
var textEndPoint: CGPoint?
|
|
|
|
var borderLineWidth: CGFloat = 0
|
|
var borderImage: UIImage?
|
|
var borderColor: UIColor?
|
|
var borderColors: [CGColor]?
|
|
var borderStartPoint: CGPoint?
|
|
var borderEndPoint: CGPoint?
|
|
|
|
|
|
|
|
|
|
override var intrinsicContentSize: CGSize {
|
|
let size = super.intrinsicContentSize
|
|
return .init(width: size.width + borderLineWidth / 2, height: size.height)
|
|
}
|
|
|
|
override func drawText(in rect: CGRect) {
|
|
guard let context = UIGraphicsGetCurrentContext(),
|
|
let text = self.text else {
|
|
super.drawText(in: rect)
|
|
return
|
|
}
|
|
|
|
|
|
// var attributes: [NSAttributedString.Key: Any] = [:]
|
|
//
|
|
// if let att = self.attributedText?.yy_attributes {
|
|
// att.forEach {
|
|
// let key = NSAttributedString.Key.init($0)
|
|
// attributes[key] = $1
|
|
// }
|
|
//
|
|
// } else if let font = self.font {
|
|
// attributes = [
|
|
// .font: font
|
|
// ]
|
|
// }
|
|
|
|
// let textSize = text.size(withAttributes: attributes)
|
|
// let x = (rect.width - textSize.width) / 2
|
|
// let y = (rect.height - textSize.height) / 2
|
|
|
|
let textSize = self.attributedText?.boundingRect(with: rect.size, options: [.usesLineFragmentOrigin, .usesFontLeading], context: nil).size ?? .zero
|
|
let x = 0.0
|
|
let y = 0.0
|
|
let textRect = CGRect(x: x, y: y, width: textSize.width, height: textSize.height)
|
|
|
|
|
|
context.setLineWidth(borderLineWidth)
|
|
context.setLineJoin(.round)
|
|
// 先描边
|
|
context.setTextDrawingMode(.stroke)
|
|
if let image = self.borderImage {
|
|
self.textColor = UIColor(patternImage: image.sp_resized(to: rect.size))
|
|
} else if let colors = self.borderColors, let startPoint = self.borderStartPoint, let endPoine = self.borderEndPoint {
|
|
self.textColor = UIColor(patternImage: UIImage.fa_getGradientImage(size: size, colors: colors, startPoint: startPoint, endPoint: endPoine))
|
|
} else {
|
|
self.textColor = self.borderColor ?? .clear
|
|
}
|
|
super.drawText(in: textRect)
|
|
|
|
// 再填充
|
|
context.setTextDrawingMode(.fill)
|
|
if let image = self.textColorImage {
|
|
self.textColor = UIColor(patternImage: image.sp_resized(to: rect.size))
|
|
} else if let colors = self.textColors, let startPoint = self.textStartPoint, let endPoine = self.textEndPoint {
|
|
self.textColor = UIColor(patternImage: UIImage.fa_getGradientImage(size: size, colors: colors, startPoint: startPoint, endPoint: endPoine))
|
|
} else {
|
|
self.textColor = fa_textColor // 填充色
|
|
}
|
|
super.drawText(in: textRect)
|
|
}
|
|
|
|
}
|
|
|
|
extension UIImage {
|
|
|
|
static func fa_getGradientImage(size: CGSize, colors: [CGColor], startPoint: CGPoint, endPoint: CGPoint) -> UIImage{
|
|
|
|
UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
|
|
guard let context = UIGraphicsGetCurrentContext() else{return UIImage()}
|
|
let colorSpace = CGColorSpaceCreateDeviceRGB()
|
|
///设置渐变颜色
|
|
let gradientRef = CGGradient(colorsSpace: colorSpace, colors: colors as CFArray, locations: nil)!
|
|
let startPoint = CGPoint(x: size.width * startPoint.x, y: size.height * startPoint.y)
|
|
let endPoint = CGPoint(x: size.width * endPoint.x, y: size.height * endPoint.y)
|
|
context.drawLinearGradient(gradientRef, start: startPoint, end: endPoint, options: CGGradientDrawingOptions(arrayLiteral: .drawsBeforeStartLocation,.drawsAfterEndLocation))
|
|
let gradientImage = UIGraphicsGetImageFromCurrentImageContext()
|
|
UIGraphicsEndImageContext()
|
|
return gradientImage ?? UIImage()
|
|
}
|
|
|
|
func sp_resized(to size: CGSize) -> UIImage {
|
|
let renderer = UIGraphicsImageRenderer(size: size)
|
|
return renderer.image { _ in
|
|
self.draw(in: CGRect(origin: .zero, size: size))
|
|
}
|
|
}
|
|
|
|
}
|