TSCustomStackView.swift 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. //
  2. // CustomStackView.swift
  3. // TestUIKit
  4. //
  5. // Created by 100Years on 2025/2/24.
  6. //
  7. import UIKit
  8. import SnapKit
  9. open class TSCustomStackView: UIView {
  10. // 内部的 UIScrollView 和 UIStackView
  11. public let scrollView: UIScrollView
  12. public let stackView: UIStackView
  13. // 开放的属性,用于设置方向和间距
  14. public var axis: NSLayoutConstraint.Axis {
  15. get {
  16. return stackView.axis
  17. }
  18. set {
  19. stackView.axis = newValue
  20. updateScrollViewConstraints()
  21. }
  22. }
  23. public var spacing: CGFloat {
  24. get {
  25. return stackView.spacing
  26. }
  27. set {
  28. stackView.spacing = newValue
  29. }
  30. }
  31. public var viewH:CGFloat {
  32. get {
  33. return scrollView.contentSize.height
  34. }
  35. }
  36. // 初始化方法
  37. public init(axis: NSLayoutConstraint.Axis = .vertical,alignment:UIStackView.Alignment = .leading, spacing: CGFloat = 0) {
  38. self.scrollView = UIScrollView()
  39. self.scrollView.showsVerticalScrollIndicator = false
  40. self.scrollView.showsHorizontalScrollIndicator = false
  41. self.stackView = UIStackView()
  42. self.stackView.axis = axis
  43. self.stackView.spacing = spacing
  44. self.stackView.alignment = alignment
  45. self.stackView.distribution = .fill
  46. super.init(frame: .zero)
  47. setupUI()
  48. }
  49. required public init?(coder: NSCoder) {
  50. fatalError("init(coder:) has not been implemented")
  51. }
  52. // 设置 UI
  53. private func setupUI() {
  54. // 添加 scrollView
  55. addSubview(scrollView)
  56. scrollView.snp.makeConstraints { make in
  57. make.edges.equalToSuperview()
  58. }
  59. // 添加 stackView 到 scrollView
  60. scrollView.addSubview(stackView)
  61. updateScrollViewConstraints()
  62. }
  63. // 根据轴方向更新约束
  64. private func updateScrollViewConstraints() {
  65. stackView.snp.remakeConstraints { make in
  66. make.edges.equalToSuperview()
  67. // 根据轴方向设置 contentSize
  68. if axis == .vertical {
  69. make.width.equalTo(scrollView)
  70. } else {
  71. make.height.equalTo(scrollView)
  72. }
  73. }
  74. }
  75. // 动态添加子视图的方法
  76. public func addSubviewToStack(_ view: UIView,length:CGFloat? = nil) {
  77. stackView.addArrangedSubview(view)
  78. view.snp.makeConstraints { make in
  79. if axis == .vertical {
  80. make.width.equalTo(stackView)
  81. if let length = length {
  82. make.height.equalTo(length)
  83. }
  84. } else {
  85. make.height.equalTo(stackView)
  86. if let length = length {
  87. make.width.equalTo(length)
  88. }
  89. }
  90. }
  91. }
  92. //动态添加子视图的方法(添加到白板一个空板 View)
  93. public func addSubviewToStackWhiteBoard(_ view: UIView,length:CGFloat? = nil) {
  94. let bgView = UIView()
  95. bgView.addSubview(view)
  96. bgView.isUserInteractionEnabled = true
  97. addSubviewToStack(bgView,length: length)
  98. }
  99. // 在指定位置插入子视图
  100. public func insertViewToStack(_ view: UIView, at stackIndex: Int) {
  101. stackView.insertArrangedSubview(view, at: stackIndex)
  102. // 可以根据需要对子视图进行额外的布局设置
  103. view.snp.makeConstraints { make in
  104. if axis == .vertical {
  105. make.width.equalTo(stackView)
  106. } else {
  107. make.height.equalTo(stackView)
  108. }
  109. }
  110. }
  111. // 移除子视图
  112. public func removeViewToStack(_ view: UIView) {
  113. stackView.removeArrangedSubview(view)
  114. view.removeFromSuperview()
  115. }
  116. public func addSpacing(length:CGFloat) {
  117. let view = UIView()
  118. addSubviewToStack(view)
  119. view.snp.makeConstraints { make in
  120. if axis == .vertical {
  121. make.height.equalTo(length)
  122. } else {
  123. make.width.equalTo(length)
  124. }
  125. }
  126. }
  127. }
  128. extension UIStackView {
  129. public func addSpacing(length:CGFloat) {
  130. let view = UIView()
  131. self.addArrangedSubview(view)
  132. view.snp.makeConstraints { make in
  133. if axis == .vertical {
  134. make.width.equalToSuperview()
  135. make.height.equalTo(length)
  136. } else {
  137. make.width.equalTo(length)
  138. make.height.equalToSuperview()
  139. }
  140. }
  141. }
  142. }