MOGradientLabel.swift 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. //
  2. // MOGradientLabel.swift
  3. // MiMoLive
  4. //
  5. // Created by OneeChan on 2025/9/25.
  6. //
  7. import Foundation
  8. import UIKit
  9. class MOGradientLabel: UILabel {
  10. private let gradientLayer = CAGradientLayer()
  11. var gradientColors: [UIColor] = [.red, .blue]
  12. var startPoint: CGPoint = .init(x: 0, y: 0.5)
  13. var endPoint: CGPoint = .init(x: 1, y: 0.5)
  14. }
  15. extension MOGradientLabel {
  16. override func layoutSubviews() {
  17. super.layoutSubviews()
  18. applyGradient()
  19. }
  20. private func applyGradient() {
  21. gradientLayer.colors = gradientColors.map { $0.cgColor }
  22. gradientLayer.startPoint = startPoint
  23. gradientLayer.endPoint = endPoint
  24. gradientLayer.frame = bounds
  25. // 创建文字遮罩
  26. let textMask = CALayer()
  27. textMask.contents = UIGraphicsImageRenderer(size: bounds.size).image { _ in
  28. text?.draw(in: bounds, withAttributes: [
  29. .font: font ?? UIFont.systemFont(ofSize: 17),
  30. .foregroundColor: textColor ?? .white
  31. ])
  32. }.cgImage
  33. textMask.frame = bounds
  34. // 将文字遮罩应用到渐变层
  35. gradientLayer.mask = textMask
  36. if gradientLayer.superlayer == nil {
  37. layer.insertSublayer(gradientLayer, at: 0)
  38. }
  39. }
  40. }
  41. //import SwiftUI
  42. //
  43. //struct MOGradientLabelPreview: UIViewRepresentable {
  44. // func makeUIView(context: Context) -> some UIView {
  45. // let view = UIView()
  46. // let testView = MOGradientLabel()
  47. // testView.text = "This is a test"
  48. // view.addSubview(testView)
  49. // testView.snp.makeConstraints { make in
  50. // make.leading.centerY.equalToSuperview()
  51. // }
  52. // return view
  53. // }
  54. //
  55. // func updateUIView(_ uiView: UIViewType, context: Context) {
  56. //
  57. // }
  58. //}
  59. //
  60. //#Preview {
  61. // MOGradientLabelPreview()
  62. //}