LNUserSearchTabsView.swift 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //
  2. // LNUserSearchTabsView.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/3/19.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNUserSearchTabsView: UIView {
  11. private let stackView = UIStackView()
  12. private let indicator = UIImageView(image: .primary_7)
  13. private var buttons: [UIButton] = []
  14. var onSelect: ((LNUserSearchTab) -> Void)?
  15. private var selectedTab: LNUserSearchTab = .overview
  16. override init(frame: CGRect) {
  17. super.init(frame: frame)
  18. setupViews()
  19. }
  20. required init?(coder: NSCoder) {
  21. fatalError("init(coder:) has not been implemented")
  22. }
  23. func update(selected: LNUserSearchTab, animated: Bool) {
  24. selectedTab = selected
  25. for (index, button) in buttons.enumerated() {
  26. let isSelected = index == selected.rawValue
  27. button.setTitleColor(isSelected ? .text_5 : .text_2, for: .normal)
  28. button.titleLabel?.font = isSelected ? .heading_h3 : .heading_h4
  29. if isSelected {
  30. indicator.snp.remakeConstraints { make in
  31. make.centerX.equalTo(button)
  32. make.top.equalTo(button.titleLabel!.snp.bottom)
  33. make.width.equalTo(23)
  34. make.height.equalTo(2)
  35. }
  36. }
  37. }
  38. let updates = { self.layoutIfNeeded() }
  39. if animated {
  40. UIView.animate(withDuration: 0.22, delay: 0, options: [.curveEaseInOut]) {
  41. updates()
  42. }
  43. } else {
  44. updates()
  45. }
  46. }
  47. }
  48. extension LNUserSearchTabsView {
  49. private func setupViews() {
  50. backgroundColor = .white
  51. stackView.axis = .horizontal
  52. stackView.spacing = 20
  53. stackView.alignment = .center
  54. addSubview(stackView)
  55. stackView.snp.makeConstraints { make in
  56. make.leading.equalToSuperview().offset(16)
  57. make.top.equalToSuperview().offset(4)
  58. make.bottom.equalToSuperview().offset(-10)
  59. }
  60. for tab in LNUserSearchTab.allCases {
  61. let button = UIButton(type: .system)
  62. button.tag = tab.rawValue
  63. button.tintColor = .clear
  64. button.setTitle(tab.title, for: .normal)
  65. button.titleLabel?.font = .heading_h4
  66. button.addAction(UIAction(handler: { [weak self] _ in
  67. self?.onSelect?(tab)
  68. }), for: .touchUpInside)
  69. buttons.append(button)
  70. stackView.addArrangedSubview(button)
  71. }
  72. indicator.layer.cornerRadius = 1
  73. indicator.clipsToBounds = true
  74. addSubview(indicator)
  75. }
  76. }