LNSkillPhotosView.swift 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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.isUserInteractionEnabled = true
  32. imageView.onTap { [weak self] in
  33. guard let self else { return }
  34. presentImagePreview(urls, index)
  35. }
  36. container.addSubview(imageView)
  37. imageView.snp.makeConstraints { make in
  38. make.leading.equalToSuperview()
  39. make.trailing.equalToSuperview().offset(detail.images.count < 2 ? 0 : -10)
  40. make.verticalEdges.equalToSuperview()
  41. }
  42. imageView.sd_setImage(with: URL(string: url))
  43. if index == 0, !detail.voiceBar.isEmpty {
  44. container.addSubview(voiceBar)
  45. voiceBar.snp.makeConstraints { make in
  46. make.trailing.equalToSuperview().offset(-20)
  47. make.bottom.equalToSuperview().offset(-10)
  48. }
  49. voiceBar.setVoice(detail.voiceBar)
  50. }
  51. stackView.addArrangedSubview(container)
  52. container.snp.makeConstraints { make in
  53. make.size.equalTo(stackView.superview!)
  54. }
  55. }
  56. scrollView.snp.updateConstraints { make in
  57. make.trailing.equalToSuperview().offset(detail.images.count < 2 ? 0 : -23)
  58. }
  59. }
  60. required init?(coder: NSCoder) {
  61. fatalError("init(coder:) has not been implemented")
  62. }
  63. }
  64. extension LNSkillPhotosView {
  65. private func setupViews() {
  66. clipsToBounds = false
  67. scrollView.isPagingEnabled = true
  68. scrollView.clipsToBounds = false
  69. scrollView.showsVerticalScrollIndicator = false
  70. scrollView.showsHorizontalScrollIndicator = false
  71. addSubview(scrollView)
  72. scrollView.snp.makeConstraints { make in
  73. make.verticalEdges.equalToSuperview()
  74. make.leading.equalToSuperview()
  75. make.trailing.equalToSuperview().offset(-23)
  76. make.height.equalTo(scrollView.snp.width).multipliedBy(193.0/343.0)
  77. }
  78. let fakeView = UIView()
  79. scrollView.addSubview(fakeView)
  80. fakeView.snp.makeConstraints { make in
  81. make.leading.top.bottom.equalToSuperview()
  82. make.height.equalToSuperview()
  83. make.width.equalTo(0)
  84. }
  85. stackView.axis = .horizontal
  86. stackView.spacing = 0
  87. scrollView.addSubview(stackView)
  88. stackView.snp.makeConstraints { make in
  89. make.edges.equalToSuperview()
  90. }
  91. }
  92. }