130 lines
3.7 KiB
Swift
130 lines
3.7 KiB
Swift
//
|
|
// SPHomeSearchHistoryView.swift
|
|
// Thimra
|
|
//
|
|
// Created by Overseas on 2025/4/22.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
class SPHomeSearchHistoryView: UIView {
|
|
|
|
|
|
override var intrinsicContentSize: CGSize {
|
|
return CGSize(width: kSPScreenWidth, height: 30 + self.tagView.intrinsicContentSize.height)
|
|
}
|
|
|
|
var viewModel: SPSearchViewModel? {
|
|
didSet {
|
|
viewModel?.addObserver(self, forKeyPath: "searchHistoryArr", context: nil)
|
|
|
|
self.tagView.reloadData()
|
|
|
|
self.invalidateIntrinsicContentSize()
|
|
}
|
|
}
|
|
|
|
var searchTextBlock: ((_ text: String) -> Void)?
|
|
|
|
private lazy var titleLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.font = .fontBold(ofSize: 16)
|
|
label.textColor = .colorE7F5FF()
|
|
label.text = "Historical search".localized
|
|
return label
|
|
}()
|
|
|
|
private lazy var deleteButton: UIButton = {
|
|
let button = UIButton(type: .custom)
|
|
button.setImage(UIImage(named: "delete_icon_03"), for: .normal)
|
|
button.addTarget(self, action: #selector(handleDeleteButton), for: .touchUpInside)
|
|
return button
|
|
}()
|
|
|
|
private lazy var tagView: JXTagView = {
|
|
let view = JXTagView()
|
|
view.delegate = self
|
|
view.dataSource = self
|
|
view.tagBorderWidth = 1
|
|
view.tagBorderColor = .colorFFFFFF(alpha: 0.2)
|
|
view.tagHeight = 20
|
|
view.tagCornerRadius = 10
|
|
view.tagBackgroundColor = .clear
|
|
view.textFont = .fontRegular(ofSize: 12)
|
|
view.textColor = .colorFFFFFF(alpha: 0.8)
|
|
view.textMargin = 8
|
|
view.tagHorizontalGap = 12
|
|
view.tagVerticalGap = 12
|
|
view.leftAndRightMargin = 16
|
|
return view
|
|
}()
|
|
|
|
deinit {
|
|
viewModel?.removeObserver(self, forKeyPath: "searchHistoryArr")
|
|
}
|
|
|
|
override init(frame: CGRect) {
|
|
super.init(frame: frame)
|
|
|
|
_setupUI()
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
|
|
if keyPath == "searchHistoryArr" {
|
|
self.tagView.reloadData()
|
|
}
|
|
}
|
|
|
|
|
|
@objc private func handleDeleteButton() {
|
|
self.viewModel?.cleanSearchHistory()
|
|
}
|
|
}
|
|
|
|
extension SPHomeSearchHistoryView {
|
|
|
|
private func _setupUI() {
|
|
addSubview(titleLabel)
|
|
addSubview(deleteButton)
|
|
addSubview(tagView)
|
|
|
|
titleLabel.snp.makeConstraints { make in
|
|
make.left.equalToSuperview().offset(16)
|
|
make.centerY.equalTo(deleteButton)
|
|
}
|
|
|
|
deleteButton.snp.makeConstraints { make in
|
|
make.right.equalToSuperview().offset(-16)
|
|
make.top.equalToSuperview()
|
|
}
|
|
|
|
tagView.snp.makeConstraints { make in
|
|
make.left.right.equalToSuperview()
|
|
make.bottom.equalToSuperview()
|
|
// make.top.equalTo(self.titleLabel.snp.bottom).offset(12)
|
|
make.top.equalToSuperview().offset(30)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//MARK: -------------- JXTagViewDelegate & JXTagViewDataSource --------------
|
|
extension SPHomeSearchHistoryView: JXTagViewDelegate, JXTagViewDataSource {
|
|
func jx_tagView(tagView: JXTagView, titleForIndex index: Int) -> String? {
|
|
return viewModel?.searchHistoryArr[index]
|
|
}
|
|
|
|
func jx_number(in tagView: JXTagView) -> Int {
|
|
return viewModel?.searchHistoryArr.count ?? 0
|
|
}
|
|
|
|
func jx_tagView(tagView: JXTagView, didSelectedTagAt index: Int) {
|
|
guard let text = viewModel?.searchHistoryArr[index] else { return }
|
|
self.searchTextBlock?(text)
|
|
}
|
|
}
|