| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- //
- // LNUserSearchTabsView.swift
- // Gami
- //
- // Created by OneeChan on 2026/3/19.
- //
- import Foundation
- import UIKit
- import SnapKit
- class LNUserSearchTabsView: UIView {
- private let stackView = UIStackView()
- private let indicator = UIImageView(image: .primary_7)
- private var buttons: [UIButton] = []
-
- var onSelect: ((LNUserSearchTab) -> Void)?
- private var selectedTab: LNUserSearchTab = .overview
-
- override init(frame: CGRect) {
- super.init(frame: frame)
- setupViews()
- }
-
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
-
- func update(selected: LNUserSearchTab, animated: Bool) {
- selectedTab = selected
-
- for (index, button) in buttons.enumerated() {
- let isSelected = index == selected.rawValue
- button.setTitleColor(isSelected ? .text_5 : .text_2, for: .normal)
- button.titleLabel?.font = isSelected ? .heading_h3 : .heading_h4
- if isSelected {
- indicator.snp.remakeConstraints { make in
- make.centerX.equalTo(button)
- make.top.equalTo(button.titleLabel!.snp.bottom)
- make.width.equalTo(23)
- make.height.equalTo(2)
- }
- }
- }
-
- let updates = { self.layoutIfNeeded() }
- if animated {
- UIView.animate(withDuration: 0.22, delay: 0, options: [.curveEaseInOut]) {
- updates()
- }
- } else {
- updates()
- }
- }
- }
- extension LNUserSearchTabsView {
- private func setupViews() {
- backgroundColor = .white
-
- stackView.axis = .horizontal
- stackView.spacing = 20
- stackView.alignment = .center
- addSubview(stackView)
- stackView.snp.makeConstraints { make in
- make.leading.equalToSuperview().offset(16)
- make.top.equalToSuperview().offset(4)
- make.bottom.equalToSuperview().offset(-10)
- }
-
- for tab in LNUserSearchTab.allCases {
- let button = UIButton(type: .system)
- button.tag = tab.rawValue
- button.tintColor = .clear
- button.setTitle(tab.title, for: .normal)
- button.titleLabel?.font = .heading_h4
- button.addAction(UIAction(handler: { [weak self] _ in
- self?.onSelect?(tab)
- }), for: .touchUpInside)
- buttons.append(button)
- stackView.addArrangedSubview(button)
- }
-
- indicator.layer.cornerRadius = 1
- indicator.clipsToBounds = true
- addSubview(indicator)
- }
- }
|