MOPkTopUsersView.swift 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. //
  2. // MOPkTopUsersView.swift
  3. // MiMoLive
  4. //
  5. // Created by MiMo on 2025/9/28.
  6. //
  7. import UIKit
  8. /// 头像组排布方向
  9. enum AvatarAlignment {
  10. case left // 左边(从右向左排列)
  11. case right // 右边(从左向右排列)
  12. }
  13. class MOPkTopUsersView: UIView {
  14. private let maxCount = 3
  15. private var itemViewArray: [MOPkTopUsersItemView] = []
  16. var alignment: AvatarAlignment = .left
  17. var haveMvp: Bool = false {
  18. didSet {
  19. let firstItemView = itemViewArray.first
  20. firstItemView?.borderImgView.image = UIImage(named: haveMvp ? "icon_pk_mvp" : "icon_pk_top_1")
  21. }
  22. }
  23. lazy var stackView: UIStackView = {
  24. let stackView = UIStackView()
  25. stackView.spacing = 0
  26. stackView.alignment = .center
  27. stackView.axis = .horizontal
  28. return stackView
  29. }()
  30. init(alignment: AvatarAlignment) {
  31. self.alignment = alignment
  32. super.init(frame: .zero)
  33. setupViews()
  34. }
  35. required init?(coder: NSCoder) {
  36. super.init(coder: coder)
  37. setupViews()
  38. }
  39. private func setupViews() {
  40. addSubview(stackView)
  41. stackView.snp.makeConstraints { make in
  42. make.edges.equalTo(0)
  43. }
  44. configureDefaultAvatars()
  45. updateAlignment()
  46. }
  47. private func updateAlignment() {
  48. switch alignment {
  49. case .left:
  50. stackView.semanticContentAttribute = .forceRightToLeft
  51. case .right:
  52. stackView.semanticContentAttribute = .forceLeftToRight
  53. }
  54. }
  55. /// 设置默认头像
  56. func configureDefaultAvatars() {
  57. stackView.arrangedSubviews.forEach { $0.removeFromSuperview() }
  58. let itemView = MOPkTopUsersItemView()
  59. if alignment == .left {
  60. itemView.avatarImgView.image = UIImage(named: "icon_chair_blue")
  61. } else {
  62. itemView.avatarImgView.image = UIImage(named: "icon_chair_red")
  63. }
  64. itemView.borderImgView.image = UIImage(named: "icon_pk_top_1")
  65. itemView.borderImgView.isHidden = true
  66. stackView.addArrangedSubview(itemView)
  67. itemViewArray.append(itemView)
  68. }
  69. /// 设置头像数据
  70. func setupAvatars(with urls: [String]) {
  71. let placeholder = alignment == .left
  72. ? UIImage(named: "icon_chair_blue")
  73. : UIImage(named: "icon_chair_red")
  74. let urls = urls.prefix(3)
  75. for (i, url) in urls.enumerated() {
  76. let itemView = if i < itemViewArray.count {
  77. itemViewArray[i]
  78. } else {
  79. MOPkTopUsersItemView()
  80. }
  81. if alignment == .left {
  82. itemView.avatarImgView.image = UIImage(named: "icon_chair_blue")
  83. } else {
  84. itemView.avatarImgView.image = UIImage(named: "icon_chair_red")
  85. }
  86. itemView.borderImgView.image = UIImage(named: "icon_pk_top_\(i + 1)")
  87. itemView.borderImgView.isHidden = false
  88. stackView.addArrangedSubview(itemView)
  89. if !itemViewArray.contains(itemView) {
  90. itemViewArray.append(itemView)
  91. }
  92. itemView.avatarImgView.sd_setImage(with: URL(string: url), placeholderImage: placeholder)
  93. }
  94. }
  95. }
  96. //import SwiftUI
  97. //
  98. //struct MOPkTopUsersViewPreview: UIViewRepresentable {
  99. // func makeUIView(context: Context) -> some UIView {
  100. // let view = UIView()
  101. // view.backgroundColor = .white
  102. //
  103. // let itemView1 = MOPkTopUsersView(alignment: .left)
  104. // itemView1.haveMvp = true
  105. //
  106. // let avatars = ["https://mimo-test.s3.ap-southeast-3.amazonaws.com/av/2025/98/mna/82d793c8fc8d748c7e7b681f98597014.jpg", "https://mimo-test.s3.ap-southeast-3.amazonaws.com/av/2025/98/mna/82d793c8fc8d748c7e7b681f98597014.jpg", "https://mimo-test.s3.ap-southeast-3.amazonaws.com/av/2025/98/mna/82d793c8fc8d748c7e7b681f98597014.jpg", "https://mimo-test.s3.ap-southeast-3.amazonaws.com/av/2025/98/mna/82d793c8fc8d748c7e7b681f98597014.jpg"]
  107. // itemView1.setupAvatars(with: avatars)
  108. //
  109. // view.addSubview(itemView1)
  110. // itemView1.snp.makeConstraints { make in
  111. // make.leading.equalTo(5)
  112. // make.centerY.equalToSuperview()
  113. // }
  114. // view.addSubview(itemView1)
  115. //
  116. // let itemView2 = MOPkTopUsersView(alignment: .right)
  117. // view.addSubview(itemView2)
  118. // itemView2.snp.makeConstraints { make in
  119. // make.trailing.equalTo(-5)
  120. // make.centerY.equalToSuperview()
  121. // }
  122. // view.addSubview(itemView1)
  123. //
  124. // return view
  125. // }
  126. //
  127. // func updateUIView(_ uiView: UIViewType, context: Context) { }
  128. //}
  129. //
  130. //#Preview {
  131. // MOPkTopUsersViewPreview()
  132. //}