LNSkillFieldPhotoEditView.swift 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. //
  2. // LNSkillFieldPhotoEditView.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/1/21.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNSkillFieldPhotoEditView: LNSkillFieldBaseEditView {
  11. private var maxCount = -1
  12. private let stackView = UIStackView()
  13. private let addImageButton = UIButton()
  14. override init(frame: CGRect) {
  15. super.init(frame: frame)
  16. setupViews()
  17. }
  18. override func update(_ field: LNSkillEditField) {
  19. super.update(field)
  20. if let limit = field.validate.arraySize {
  21. maxCount = limit.max
  22. }
  23. if let urls = field.value as? [String] {
  24. for url in urls {
  25. let imageView = buildImageView()
  26. imageView.loadImage(url: url)
  27. stackView.addArrangedSubview(imageView)
  28. imageView.snp.makeConstraints { make in
  29. make.height.equalToSuperview()
  30. make.width.equalTo(imageView.snp.height)
  31. }
  32. }
  33. updateImageCount()
  34. }
  35. }
  36. required init(coder: NSCoder) {
  37. fatalError("init(coder:) has not been implemented")
  38. }
  39. }
  40. extension LNSkillFieldPhotoEditView: LNImageUploadViewDelegate {
  41. func onImageUploadView(view: LNImageUploadView, didUploadImage url: String) {
  42. guard let field else { return }
  43. let imageViews = stackView.arrangedSubviews.filter { $0 is LNImageUploadView } as! [LNImageUploadView]
  44. field.value = imageViews.compactMap({ $0.imageUrl })
  45. delegate?.onSkillFieldBaseEditViewInputChanged(view: self)
  46. needReview = true
  47. }
  48. func onImageUploadViewDidClickDelete(view: LNImageUploadView) {
  49. stackView.removeArrangedSubview(view)
  50. view.removeFromSuperview()
  51. guard let field else { return }
  52. let imageViews = stackView.arrangedSubviews.filter { $0 is LNImageUploadView } as! [LNImageUploadView]
  53. field.value = imageViews.compactMap({ $0.imageUrl })
  54. delegate?.onSkillFieldBaseEditViewInputChanged(view: self)
  55. updateImageCount()
  56. needReview = true
  57. }
  58. }
  59. extension LNSkillFieldPhotoEditView {
  60. private func updateImageCount() {
  61. guard maxCount > 0 else { return }
  62. let imageViews = stackView.arrangedSubviews.filter { $0 is LNImageUploadView }
  63. addImageButton.isHidden = imageViews.count >= maxCount
  64. }
  65. private func setupViews() {
  66. let scrollView = UIScrollView()
  67. scrollView.showsVerticalScrollIndicator = false
  68. scrollView.showsHorizontalScrollIndicator = false
  69. scrollView.clipsToBounds = false
  70. container.addSubview(scrollView)
  71. scrollView.snp.makeConstraints { make in
  72. make.horizontalEdges.equalToSuperview()
  73. make.verticalEdges.equalToSuperview().inset(2)
  74. make.height.equalTo(90)
  75. }
  76. stackView.axis = .horizontal
  77. stackView.spacing = 6
  78. scrollView.addSubview(stackView)
  79. stackView.snp.makeConstraints { make in
  80. make.horizontalEdges.equalToSuperview()
  81. make.verticalEdges.equalToSuperview()
  82. make.height.equalToSuperview()
  83. }
  84. let config = UIImage.SymbolConfiguration(pointSize: 17, weight: .semibold)
  85. addImageButton.backgroundColor = .fill_2
  86. addImageButton.layer.cornerRadius = 9
  87. addImageButton.setImage(.init(systemName: "plus", withConfiguration: config), for: .normal)
  88. addImageButton.tintColor = .text_3
  89. addImageButton.addAction(UIAction(handler: { [weak self] _ in
  90. guard let self else { return }
  91. LNBottomSheetMenu.showImageSelectMenu(view: self) { [weak self] image, _ in
  92. guard let self else { return }
  93. guard let image = image?.compress(type: .photoWall) else { return }
  94. let imageView = buildImageView()
  95. imageView.uploadImage(image: image)
  96. stackView.insertArrangedSubview(imageView, at: 1)
  97. imageView.snp.makeConstraints { make in
  98. make.height.equalToSuperview()
  99. make.width.equalTo(imageView.snp.height)
  100. }
  101. updateImageCount()
  102. }
  103. }), for: .touchUpInside)
  104. stackView.addArrangedSubview(addImageButton)
  105. addImageButton.snp.makeConstraints { make in
  106. make.height.equalToSuperview()
  107. make.width.equalTo(addImageButton.snp.height)
  108. }
  109. }
  110. private func buildImageView() -> LNImageUploadView {
  111. let imageView = LNImageUploadView()
  112. imageView.uploadType = .other
  113. imageView.layer.cornerRadius = 9
  114. imageView.clipsToBounds = true
  115. imageView.showClearButton = true
  116. imageView.delegate = self
  117. return imageView
  118. }
  119. }