LNOrderSkillListPanel.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. //
  2. // LNOrderSkillListPanel.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/11/27.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNOrderSkillListPanel: LNPopupView {
  11. private let curSkillId: String?
  12. private var handler: ((LNGameMateSkillVO) -> Void)?
  13. init(curSkillId: String?, handler: @escaping (LNGameMateSkillVO) -> Void) {
  14. self.curSkillId = curSkillId
  15. self.handler = handler
  16. super.init(frame: .zero)
  17. setupViews()
  18. }
  19. required init?(coder: NSCoder) {
  20. fatalError("init(coder:) has not been implemented")
  21. }
  22. }
  23. extension LNOrderSkillListPanel {
  24. private func setupViews() {
  25. let stackView = UIStackView()
  26. stackView.axis = .vertical
  27. stackView.spacing = 0
  28. container.addSubview(stackView)
  29. stackView.snp.makeConstraints { make in
  30. make.leading.trailing.equalToSuperview()
  31. make.top.equalToSuperview().offset(6)
  32. make.bottom.equalToSuperview().offset(-safeBottomInset - 5)
  33. }
  34. var itemViews: [UIView] = []
  35. myUserInfo.skills.forEach {
  36. itemViews.append(buildSkillItem($0))
  37. }
  38. itemViews.forEach {
  39. stackView.addArrangedSubview($0)
  40. }
  41. }
  42. private func buildSkillItem(_ skill: LNGameMateSkillVO) -> UIView {
  43. let container = UIView()
  44. let checkIc = UIImageView()
  45. checkIc.image = skill.id == curSkillId ? .icCheck : .icUncheck
  46. container.addSubview(checkIc)
  47. checkIc.snp.makeConstraints { make in
  48. make.centerY.equalToSuperview()
  49. make.trailing.equalToSuperview().offset(-16)
  50. }
  51. let skillIc = UIImageView()
  52. skillIc.layer.cornerRadius = 12
  53. skillIc.clipsToBounds = true
  54. skillIc.sd_setImage(with: URL(string: skill.icon))
  55. container.addSubview(skillIc)
  56. skillIc.snp.makeConstraints { make in
  57. make.leading.equalToSuperview().offset(16)
  58. make.centerY.equalToSuperview()
  59. make.width.height.equalTo(24)
  60. }
  61. let titleLabel = UILabel()
  62. titleLabel.text = skill.name
  63. titleLabel.font = .heading_h4
  64. titleLabel.textColor = .text_5
  65. container.addSubview(titleLabel)
  66. titleLabel.snp.makeConstraints { make in
  67. make.leading.equalTo(skillIc.snp.trailing).offset(8)
  68. make.top.equalToSuperview().offset(12)
  69. make.bottom.equalToSuperview().offset(-12)
  70. make.trailing.lessThanOrEqualTo(checkIc.snp.leading).offset(-5)
  71. }
  72. container.onTap { [weak self] in
  73. guard let self else { return }
  74. self.handler?(skill)
  75. self.dismiss()
  76. }
  77. return container
  78. }
  79. }
  80. #if DEBUG
  81. import SwiftUI
  82. struct LNOrderSkillListPanelPreview: UIViewRepresentable {
  83. func makeUIView(context: Context) -> some UIView {
  84. let container = UIView()
  85. container.backgroundColor = .lightGray
  86. let view = LNOrderSkillListPanel(curSkillId: "") { skill in
  87. }
  88. view.popup(container)
  89. return container
  90. }
  91. func updateUIView(_ uiView: UIViewType, context: Context) { }
  92. }
  93. #Preview(body: {
  94. LNOrderSkillListPanelPreview()
  95. })
  96. #endif // DEBUG