UIImage+Theme.swift 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. //
  2. // UIImage+Theme.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/11/20.
  6. //
  7. import Foundation
  8. private var customColorImage: [String: UIImage] = [:]
  9. extension UIImage {
  10. static func generateLinearGradientImage(
  11. colors: [UIColor],
  12. size: CGSize,
  13. location: [NSNumber] = [0, 1],
  14. startPoint: CGPoint = CGPoint(x: 0, y: 0),
  15. endPoint: CGPoint = CGPoint(x: 1, y: 0)
  16. ) -> UIImage? {
  17. guard colors.count >= 2, size.width > 0, size.height > 0 else {
  18. return nil
  19. }
  20. // 创建渐变图层
  21. let gradientLayer = CAGradientLayer()
  22. gradientLayer.frame = CGRect(origin: .zero, size: size)
  23. gradientLayer.colors = colors.map { $0.cgColor } // 转换为 CGColor
  24. gradientLayer.locations = location
  25. gradientLayer.startPoint = startPoint
  26. gradientLayer.endPoint = endPoint
  27. // 渲染图层为图片
  28. let renderer = UIGraphicsImageRenderer(size: size)
  29. return renderer.image { _ in
  30. gradientLayer.render(in: UIGraphicsGetCurrentContext()!)
  31. }
  32. }
  33. static func image(for color: UIColor, size: CGFloat = 10, cornerRadius: CGFloat? = nil) -> UIImage {
  34. let key = "fill_\(color.hash)_\(size)_\(cornerRadius ?? 0)"
  35. if let cache = customColorImage[key] {
  36. return cache
  37. }
  38. let imageSize = CGSize(width: size, height: size)
  39. let renderer = UIGraphicsImageRenderer(size: imageSize)
  40. let newImage = renderer.image { context in
  41. let rect = CGRect(origin: .zero, size: imageSize)
  42. color.setFill()
  43. if let cornerRadius {
  44. let path = UIBezierPath(
  45. roundedRect: rect,
  46. cornerRadius: min(cornerRadius, size/2)
  47. )
  48. path.fill()
  49. } else {
  50. context.fill(CGRect(origin: .zero, size: imageSize))
  51. }
  52. }
  53. customColorImage[key] = newImage
  54. return newImage
  55. }
  56. static let primary_3: UIImage? = {
  57. let size = CGSize(width: 10, height: 10)
  58. let renderer = UIGraphicsImageRenderer(size: size)
  59. return renderer.image { context in
  60. UIColor.primary_3.setFill()
  61. context.fill(CGRect(origin: .zero, size: size))
  62. }
  63. }()
  64. static let fill: UIImage? = {
  65. let size = CGSize(width: 10, height: 10)
  66. let renderer = UIGraphicsImageRenderer(size: size)
  67. return renderer.image { context in
  68. UIColor.fill.setFill()
  69. context.fill(CGRect(origin: .zero, size: size))
  70. }
  71. }()
  72. static let primary_6: UIImage? = {
  73. var view = UIView()
  74. view.frame = CGRect(x: 0, y: 0, width: 10, height: 10)
  75. let layer0 = CAGradientLayer()
  76. layer0.colors = [
  77. UIColor(red: 0.719, green: 0.932, blue: 1, alpha: 1).cgColor,
  78. UIColor(red: 0.865, green: 1, blue: 0.719, alpha: 1).cgColor,
  79. UIColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor
  80. ]
  81. layer0.locations = [0, 0.36, 1]
  82. layer0.startPoint = CGPoint(x: 0.25, y: 0.5)
  83. layer0.endPoint = CGPoint(x: 0.75, y: 0.5)
  84. layer0.transform = CATransform3DMakeAffineTransform(CGAffineTransform(a: 0.75, b: -0.01, c: 0, d: 0.75, tx: 0, ty: 0.12))
  85. layer0.bounds = view.bounds.insetBy(dx: -0.5*view.bounds.size.width, dy: -0.5*view.bounds.size.height)
  86. layer0.position = view.center
  87. view.layer.addSublayer(layer0)
  88. let renderer = UIGraphicsImageRenderer(size: view.bounds.size)
  89. return renderer.image { _ in
  90. view.layer.render(in: UIGraphicsGetCurrentContext()!)
  91. }
  92. }()
  93. static let primary_7: UIImage? = {
  94. var view = UIView()
  95. view.frame = CGRect(x: 0, y: 0, width: 10, height: 10)
  96. let layer0 = CAGradientLayer()
  97. layer0.colors = [
  98. UIColor(hex: "#4ED2FF").cgColor,
  99. UIColor(hex: "#95E789").cgColor
  100. ]
  101. layer0.locations = [0, 1]
  102. layer0.startPoint = CGPoint(x: 0.25, y: 0.5)
  103. layer0.endPoint = CGPoint(x: 0.75, y: 0.5)
  104. layer0.transform = CATransform3DMakeAffineTransform(CGAffineTransform(a: 1.37, b: 0, c: 0, d: 1.37, tx: 0, ty: -0.19))
  105. layer0.bounds = view.bounds
  106. layer0.position = view.center
  107. view.layer.addSublayer(layer0)
  108. let renderer = UIGraphicsImageRenderer(size: view.bounds.size)
  109. return renderer.image { _ in
  110. view.layer.render(in: UIGraphicsGetCurrentContext()!)
  111. }
  112. }()
  113. static let primary_8: UIImage? = {
  114. var view = UIView()
  115. view.frame = CGRect(x: 0, y: 0, width: 10, height: 10)
  116. let layer0 = CAGradientLayer()
  117. layer0.colors = [
  118. UIColor(red: 0.183, green: 0.586, blue: 1, alpha: 1).cgColor,
  119. UIColor(red: 0.313, green: 1, blue: 0.847, alpha: 1).cgColor
  120. ]
  121. layer0.locations = [0.28, 1]
  122. layer0.startPoint = CGPoint(x: 0.25, y: 0.5)
  123. layer0.endPoint = CGPoint(x: 0.75, y: 0.5)
  124. layer0.transform = CATransform3DMakeAffineTransform(CGAffineTransform(a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0.5))
  125. layer0.bounds = view.bounds.insetBy(dx: -0.5*view.bounds.size.width, dy: -0.5*view.bounds.size.height)
  126. layer0.position = view.center
  127. view.layer.addSublayer(layer0)
  128. let renderer = UIGraphicsImageRenderer(size: view.bounds.size)
  129. return renderer.image { _ in
  130. view.layer.render(in: UIGraphicsGetCurrentContext()!)
  131. }
  132. }()
  133. }