LNMultiImagesUploadView.swift 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. //
  2. // LNMultiImagesUploadView.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/12.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. protocol LNMultiImagesUploadViewDelegate: NSObject {
  11. func onMultiImagesUploadView(view: LNMultiImagesUploadView, imageUrlsChanged urls: [String])
  12. }
  13. class LNMultiImagesUploadView: UIView {
  14. var maxPhoto = 6
  15. private let photoView = LNMultiLineStackView()
  16. private let addImageButton = UIButton()
  17. var uploadType: LNUploadFileType = .feedback
  18. weak var delegate: LNMultiImagesUploadViewDelegate?
  19. var curFileUrls: [String] {
  20. photoView.curItemViews.compactMap {
  21. ($0 as? LNImageUploadView)?.imageUrl
  22. }
  23. }
  24. override init(frame: CGRect) {
  25. super.init(frame: frame)
  26. setupViews()
  27. }
  28. required init?(coder: NSCoder) {
  29. fatalError("init(coder:) has not been implemented")
  30. }
  31. }
  32. extension LNMultiImagesUploadView: LNImageUploadViewDelegate {
  33. func onImageUploadView(view: LNImageUploadView, didUploadImage url: String) {
  34. delegate?.onMultiImagesUploadView(view: self, imageUrlsChanged: curFileUrls)
  35. }
  36. func onImageUploadViewDidClickDelete(view: LNImageUploadView) {
  37. photoView.remove([view])
  38. if !photoView.curItemViews.contains(addImageButton) {
  39. photoView.append([addImageButton])
  40. }
  41. delegate?.onMultiImagesUploadView(view: self, imageUrlsChanged: curFileUrls)
  42. }
  43. }
  44. extension LNMultiImagesUploadView {
  45. private func buildImageView() -> LNImageUploadView {
  46. let imageView = LNImageUploadView()
  47. imageView.uploadType = .other
  48. imageView.layer.cornerRadius = 10
  49. imageView.clipsToBounds = true
  50. imageView.showClearButton = true
  51. imageView.delegate = self
  52. imageView.snp.makeConstraints { make in
  53. make.width.height.equalTo(100)
  54. }
  55. return imageView
  56. }
  57. private func setupViews() {
  58. photoView.columns = 3
  59. photoView.spacing = 4
  60. photoView.itemDistribution = .equalSpacing
  61. addSubview(photoView)
  62. photoView.snp.makeConstraints { make in
  63. make.edges.equalToSuperview()
  64. make.height.equalTo(0).priority(.low)
  65. }
  66. let config = UIImage.SymbolConfiguration(pointSize: 17)
  67. addImageButton.backgroundColor = .fill_1
  68. addImageButton.layer.cornerRadius = 8.33
  69. addImageButton.setImage(.init(systemName: "plus", withConfiguration: config), for: .normal)
  70. addImageButton.tintColor = .text_3
  71. addImageButton.addAction(UIAction(handler: { [weak self] _ in
  72. guard let self else { return }
  73. LNBottomSheetMenu.showImageSelectMenu(view: self) { [weak self] image, _ in
  74. guard let self else { return }
  75. guard let image = image?.compress(type: .photoWall) else { return }
  76. var curViews = photoView.curItemViews
  77. let imageView = buildImageView()
  78. imageView.uploadImage(image: image)
  79. curViews.insert(imageView, at: 0)
  80. if curViews.count > maxPhoto {
  81. curViews.removeAll { $0 == self.addImageButton }
  82. }
  83. photoView.update(curViews)
  84. }
  85. }), for: .touchUpInside)
  86. addImageButton.snp.makeConstraints { make in
  87. make.width.height.equalTo(100)
  88. }
  89. photoView.update([addImageButton])
  90. }
  91. }