QSLVipMostGoodCell.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. //
  2. // QSLVipMostGoodCell.swift
  3. // QuickSearchLocation
  4. //
  5. // Created by Destiny on 2025/5/28.
  6. //
  7. import UIKit
  8. class QSLVipMostGoodCell: UIView {
  9. struct UX {
  10. static let mainViewHeight = 71.0.rpx
  11. static let mainViewWidth = QSLConst.qsl_kScreenW - 36.0.rpx
  12. }
  13. var goodModel: QSLGoodModel?
  14. lazy var bgView: UIView = {
  15. let view = UIView()
  16. view.backgroundColor = .hexStringColor(hexString: "#EEEEEE")
  17. view.addRadius(radius: 12)
  18. return view
  19. }()
  20. lazy var mostTagIcon: UIImageView = {
  21. let imageView = UIImageView()
  22. imageView.image = UIImage(named: "vip_goods_most_tag")
  23. return imageView
  24. }()
  25. lazy var mainView: UIView = {
  26. let view = UIView(frame: CGRect(x: 0, y: 0, width: UX.mainViewWidth, height: UX.mainViewHeight))
  27. view.addFourCorner(topLeft: 11, topRight: 11, bottomLeft: 0, bottomRight: 0)
  28. view.backgroundColor = .white
  29. return view
  30. }()
  31. lazy var priceLabel: UILabel = {
  32. let label = UILabel()
  33. label.textAlignment = .center
  34. // label.addRadius(radius: 12.rpx)
  35. // label.backgroundColor = .hexStringColor(hexString: "#F6F6F6")
  36. label.text("¥128")
  37. label.mediumFont(24)
  38. label.textColor = .hexStringColor(hexString: "#F12A1D")
  39. label.setSpecificTextColorFont("¥", color: .hexStringColor(hexString: "#F12A1D"), font: UIFont.systemFont(ofSize: 14, weight: .medium))
  40. return label
  41. }()
  42. lazy var originPriceLabel: UILabel = {
  43. let label = UILabel()
  44. label.text("¥299")
  45. label.font(13)
  46. label.textColor = .hexStringColor(hexString: "#A7A7A7")
  47. label.centerLineText(lineValue: 1, underlineColor: .hexStringColor(hexString: "#A7A7A7"))
  48. return label
  49. }()
  50. lazy var titleLabel: UILabel = {
  51. let label = UILabel()
  52. label.text("周度会员")
  53. label.boldFont(14)
  54. label.textColor = .hexStringColor(hexString: "#404040")
  55. return label
  56. }()
  57. lazy var describeLabel: UILabel = {
  58. let label = UILabel()
  59. label.text("96%用户首选")
  60. label.boldFont(9)
  61. label.textColor = .hexStringColor(hexString: "#11BD96")
  62. return label
  63. }()
  64. lazy var processBgView: UIView = {
  65. let view = UIView()
  66. view.backgroundColor = .hexStringColor(hexString: "#BAFFF1")
  67. view.addRadius(radius: 2.5.rpx)
  68. return view
  69. }()
  70. lazy var processView: UIView = {
  71. let view = UIView()
  72. view.backgroundColor = .hexStringColor(hexString: "#15CBA1")
  73. view.addRadius(radius: 2.5.rpx)
  74. return view
  75. }()
  76. lazy var recommendIcon: UIImageView = {
  77. let icon = UIImageView()
  78. icon.image = UIImage(named: "vip_recommend_tag")
  79. return icon
  80. }()
  81. lazy var dailyLabel: UILabel = {
  82. let label = UILabel()
  83. let text = "仅需¥9.2/天,时刻守护Ta的安全"
  84. label.text(text)
  85. label.font(11)
  86. label.textColor = .hexStringColor(hexString: "#818181")
  87. label.setSpecificTextColorFont("¥", color: .hexStringColor(hexString: "#818181"), font: UIFont.systemFont(ofSize: 11, weight: .heavy))
  88. if let yuanIndex = text.firstIndex(of: "¥"),
  89. let slashIndex = text.firstIndex(of: "/") {
  90. // 创建从¥后面一个字符到/前面一个字符的range
  91. let contentRange = text.index(after: yuanIndex)..<slashIndex
  92. // 将Swift的Range转换为NSRange
  93. let nsRange = NSRange(
  94. contentRange,
  95. in: text
  96. )
  97. label.setRangeFontText(font: UIFont.systemFont(ofSize: 16, weight: .heavy), range: nsRange)
  98. }
  99. return label
  100. }()
  101. lazy var selectBtn: UIButton = {
  102. let btn = UIButton()
  103. btn.setBackgroundImage(UIImage(named: "vip_good_unselect_big"), for: .normal)
  104. btn.setBackgroundImage(UIImage(named: "vip_good_select_big"), for: .selected)
  105. return btn
  106. }()
  107. override init(frame: CGRect) {
  108. super.init(frame: frame)
  109. setUI()
  110. }
  111. required init?(coder: NSCoder) {
  112. fatalError("init(coder:) has not been implemented")
  113. }
  114. func config(model: QSLGoodModel) {
  115. self.goodModel = model
  116. self.selectBtn.isSelected = model.isSelect
  117. let text = model.content
  118. self.dailyLabel.text = text
  119. if model.isSelect {
  120. self.bgView.backgroundColor = .hexStringColor(hexString: "#15CBA1")
  121. self.mainView.gradientBackgroundColor(color1: .hexStringColor(hexString: "#CAFFF3"), color2: .hexStringColor(hexString: "#FFFFFF"), width: UX.mainViewWidth, height: UX.mainViewHeight, direction: .horizontal)
  122. self.dailyLabel.textColor = .white
  123. self.dailyLabel.setSpecificTextColorFont("¥", color: .hexStringColor(hexString: "#FFFFFF"), font: UIFont.systemFont(ofSize: 9, weight: .heavy))
  124. if let yuanIndex = text.firstIndex(of: "¥"),
  125. let slashIndex = text.firstIndex(of: "/") {
  126. // 创建从¥后面一个字符到/前面一个字符的range
  127. let contentRange = text.index(after: yuanIndex)..<slashIndex
  128. // 将Swift的Range转换为NSRange
  129. let nsRange = NSRange(
  130. contentRange,
  131. in: text
  132. )
  133. self.dailyLabel.setRangeFontText(font: UIFont.systemFont(ofSize: 16, weight: .heavy), range: nsRange)
  134. }
  135. } else {
  136. self.bgView.backgroundColor = .hexStringColor(hexString: "#EEEEEE")
  137. self.mainView.backgroundColor = .white
  138. self.dailyLabel.textColor = .hexStringColor(hexString: "#818181")
  139. self.dailyLabel.setSpecificTextColorFont("¥", color: .hexStringColor(hexString: "#818181"), font: UIFont.systemFont(ofSize: 9, weight: .heavy))
  140. if let yuanIndex = text.firstIndex(of: "¥"),
  141. let slashIndex = text.firstIndex(of: "/") {
  142. // 创建从¥后面一个字符到/前面一个字符的range
  143. let contentRange = text.index(after: yuanIndex)..<slashIndex
  144. // 将Swift的Range转换为NSRange
  145. let nsRange = NSRange(
  146. contentRange,
  147. in: text
  148. )
  149. self.dailyLabel.setRangeFontText(font: UIFont.systemFont(ofSize: 16, weight: .heavy), range: nsRange)
  150. }
  151. }
  152. self.mostTagIcon.isHidden = !model.popular
  153. self.titleLabel.text = model.name
  154. // self.goodDailyPriceLabel.text = "0.001元/天"
  155. // let width = model.content.singleLineWidth(font: .textF(10)) + 24.rpx
  156. // self.goodDailyPriceLabel.snp.updateConstraints { make in
  157. // make.width.equalTo(width)
  158. // }
  159. // if let range = model.content.range(of: "/") {
  160. // let nsRange = NSRange(model.content.startIndex..<range.lowerBound, in: model.content)
  161. // self.goodDailyPriceLabel.setRangeFontText(font: .textM(20), range: nsRange)
  162. // }
  163. var priceText = ""
  164. if model.amount.truncatingRemainder(dividingBy: 100) == 0 {
  165. priceText = "¥\(Int(model.amount / 100))"
  166. } else {
  167. priceText = String(format: "¥%.2lf", model.amount / 100 )
  168. }
  169. self.priceLabel.text = priceText
  170. self.priceLabel.setSpecificTextColorFont("¥", color: .hexStringColor(hexString: "#F12A1D"), font: UIFont.systemFont(ofSize: 14, weight: .medium))
  171. // let width = priceText.singleLineWidth(font: .textF(12)) + 28.rpx
  172. // self.priceLabel.snp.updateConstraints { make in
  173. // make.width.equalTo(width)
  174. // }
  175. var orinalPriceText = ""
  176. if model.originalAmount.truncatingRemainder(dividingBy: 100) == 0 {
  177. orinalPriceText = "¥\(Int(model.originalAmount / 100))"
  178. } else {
  179. orinalPriceText = String(format: "¥%.2lf", model.originalAmount / 100 )
  180. }
  181. self.originPriceLabel.text = orinalPriceText
  182. }
  183. }
  184. extension QSLVipMostGoodCell {
  185. func setUI() {
  186. self.addSubview(bgView)
  187. bgView.snp.makeConstraints { make in
  188. make.right.bottom.equalTo(0)
  189. make.left.equalTo(6.rpx)
  190. make.top.equalTo(11.rpx)
  191. }
  192. self.addSubview(mostTagIcon)
  193. mostTagIcon.snp.makeConstraints { make in
  194. make.left.equalTo(0)
  195. make.top.equalTo(0)
  196. make.size.equalTo(CGSize(width: 85.rpx, height: 29.rpx))
  197. }
  198. self.bgView.addSubview(mainView)
  199. mainView.snp.makeConstraints { make in
  200. make.left.top.equalTo(2.rpx)
  201. make.right.equalTo(-2.rpx)
  202. make.height.equalTo(71.rpx)
  203. }
  204. self.mainView.addSubview(priceLabel)
  205. priceLabel.snp.makeConstraints { make in
  206. make.left.equalTo(17.rpx)
  207. make.top.equalTo(17.rpx)
  208. }
  209. self.mainView.addSubview(originPriceLabel)
  210. originPriceLabel.snp.makeConstraints { make in
  211. make.centerX.equalTo(priceLabel.snp.centerX)
  212. make.top.equalTo(priceLabel.snp.bottom)
  213. }
  214. self.mainView.addSubview(titleLabel)
  215. titleLabel.snp.makeConstraints { make in
  216. make.top.equalTo(17.rpx)
  217. make.left.equalTo(84.rpx)
  218. }
  219. self.mainView.addSubview(processBgView)
  220. processBgView.snp.makeConstraints { make in
  221. make.bottom.equalTo(-13.rpx)
  222. make.left.equalTo(titleLabel.snp.left)
  223. make.width.equalTo(138.rpx)
  224. make.height.equalTo(5.rpx)
  225. }
  226. self.processBgView.addSubview(processView)
  227. processView.snp.makeConstraints { make in
  228. make.left.top.bottom.equalTo(0)
  229. make.right.equalTo(-20.rpx)
  230. }
  231. self.mainView.addSubview(describeLabel)
  232. describeLabel.snp.makeConstraints { make in
  233. make.left.equalTo(processBgView.snp.left)
  234. make.bottom.equalTo(processBgView.snp.top).offset(-2.rpx)
  235. }
  236. self.mainView.addSubview(recommendIcon)
  237. recommendIcon.snp.makeConstraints { make in
  238. make.size.equalTo(CGSize(width: 73.rpx, height: 71.rpx))
  239. make.right.equalTo(0)
  240. make.top.equalTo(0)
  241. make.bottom.equalTo(0)
  242. }
  243. self.bgView.addSubview(dailyLabel)
  244. dailyLabel.snp.makeConstraints { make in
  245. make.left.equalTo(20.rpx)
  246. make.bottom.equalTo(-7.rpx)
  247. }
  248. self.bgView.addSubview(selectBtn)
  249. selectBtn.snp.makeConstraints { make in
  250. make.size.equalTo(CGSize(width: 18.rpx, height: 18.rpx))
  251. make.right.equalTo(-7.rpx)
  252. make.bottom.equalTo(-7.rpx)
  253. }
  254. }
  255. }