LNSkillPhotosView.swift 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //
  2. // LNSkillPhotosView.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/14.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNSkillPhotosView: UIView {
  11. private let stackView = UIStackView()
  12. private let scrollView = UIScrollView()
  13. private let voiceBar = LNSkillVoiceBarView()
  14. override init(frame: CGRect) {
  15. super.init(frame: frame)
  16. setupViews()
  17. }
  18. func update(_ detail: LNGameMateSkillDetailVO) {
  19. stackView.arrangedSubviews.forEach {
  20. stackView.removeArrangedSubview($0)
  21. $0.removeFromSuperview()
  22. }
  23. isHidden = detail.images.isEmpty
  24. let urls = detail.images
  25. for (index, url) in urls.enumerated() {
  26. let container = UIView()
  27. let imageView = UIImageView()
  28. imageView.layer.cornerRadius = 12
  29. imageView.clipsToBounds = true
  30. imageView.contentMode = .scaleAspectFill
  31. imageView.onTap { [weak self] in
  32. guard let self else { return }
  33. presentImagePreview(urls, index)
  34. }
  35. container.addSubview(imageView)
  36. imageView.snp.makeConstraints { make in
  37. make.leading.equalToSuperview()
  38. make.trailing.equalToSuperview().offset(detail.images.count < 2 ? 0 : -10)
  39. make.verticalEdges.equalToSuperview()
  40. }
  41. imageView.sd_setImage(with: URL(string: url))
  42. if index == 0, !detail.voiceBar.isEmpty {
  43. container.addSubview(voiceBar)
  44. voiceBar.snp.makeConstraints { make in
  45. make.trailing.equalToSuperview().offset(-20)
  46. make.bottom.equalToSuperview().offset(-10)
  47. }
  48. voiceBar.setVoice(detail.voiceBar)
  49. }
  50. stackView.addArrangedSubview(container)
  51. container.snp.makeConstraints { make in
  52. make.size.equalTo(stackView.superview!)
  53. }
  54. }
  55. scrollView.snp.updateConstraints { make in
  56. make.trailing.equalToSuperview().offset(detail.images.count < 2 ? 0 : -23)
  57. }
  58. }
  59. required init?(coder: NSCoder) {
  60. fatalError("init(coder:) has not been implemented")
  61. }
  62. }
  63. extension LNSkillPhotosView {
  64. private func setupViews() {
  65. clipsToBounds = false
  66. scrollView.isPagingEnabled = true
  67. scrollView.clipsToBounds = false
  68. scrollView.showsVerticalScrollIndicator = false
  69. scrollView.showsHorizontalScrollIndicator = false
  70. addSubview(scrollView)
  71. scrollView.snp.makeConstraints { make in
  72. make.verticalEdges.equalToSuperview()
  73. make.leading.equalToSuperview()
  74. make.trailing.equalToSuperview().offset(-23)
  75. make.height.equalTo(scrollView.snp.width).multipliedBy(193.0/343.0)
  76. }
  77. let fakeView = UIView()
  78. scrollView.addSubview(fakeView)
  79. fakeView.snp.makeConstraints { make in
  80. make.leading.top.bottom.equalToSuperview()
  81. make.height.equalToSuperview()
  82. make.width.equalTo(0)
  83. }
  84. stackView.axis = .horizontal
  85. stackView.spacing = 0
  86. scrollView.addSubview(stackView)
  87. stackView.snp.makeConstraints { make in
  88. make.edges.equalToSuperview()
  89. }
  90. }
  91. }