Fableon/Fableon/Object/Base/View/FALabel.swift
2025-10-29 10:26:27 +08:00

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