203 lines
6.2 KiB
Swift
203 lines
6.2 KiB
Swift
//
|
|
// SPSegmentControllerItem.swift
|
|
// SegmentedPageViewController
|
|
//
|
|
// Created by Sha Yan on 12/12/20.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
|
|
|
|
protocol SPSegmentedControllItemDelegate: class {
|
|
func itemDidSelected(_ item: SPSegmentedControllItem, withIndex index: Int)
|
|
}
|
|
|
|
|
|
final class SPSegmentedControllItem: UIView {
|
|
|
|
//MARK:- Variables
|
|
|
|
private var icon: UIImage? = nil
|
|
private var selectedIcon: UIImage? = nil
|
|
|
|
public var highlightColor: UIColor = .systemBlue { didSet {
|
|
highlightLabel.textColor = highlightColor
|
|
highlightIconView.tintColor = highlightColor
|
|
}}
|
|
|
|
public var textColor: UIColor = .secondaryLabel { didSet {
|
|
label.textColor = textColor
|
|
}}
|
|
|
|
public var name: String { didSet {
|
|
label.text = name
|
|
highlightLabel.text = name
|
|
}}
|
|
|
|
public var font: UIFont! { didSet {
|
|
label.font = font
|
|
highlightLabel.font = font
|
|
}}
|
|
|
|
public var highlightAlpha = CGFloat(1) { didSet {
|
|
highlightLabel.alpha = highlightAlpha
|
|
highlightIconView.alpha = highlightAlpha
|
|
iconView.alpha = 1 - highlightAlpha
|
|
}}
|
|
|
|
|
|
private(set) var index: Int
|
|
weak var delegate: SPSegmentedControllItemDelegate?
|
|
|
|
|
|
public var isSelected = false { didSet {
|
|
highlightLabel.alpha = isSelected ? 1 : 0
|
|
iconView.alpha = !isSelected ? 1 : 0
|
|
highlightIconView.alpha = isSelected ? 1 : 0
|
|
}}
|
|
|
|
private var fillBasedOnWidth: Bool = true
|
|
|
|
|
|
|
|
//MARK:- UIKit Variables
|
|
|
|
private lazy var label: UILabel = {
|
|
let label = UILabel()
|
|
label.textAlignment = .center
|
|
label.textColor = textColor
|
|
label.isUserInteractionEnabled = true
|
|
label.translatesAutoresizingMaskIntoConstraints = false
|
|
return label
|
|
}()
|
|
|
|
private lazy var highlightLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.textAlignment = .center
|
|
label.textColor = highlightColor
|
|
label.isUserInteractionEnabled = true
|
|
label.alpha = 0
|
|
label.translatesAutoresizingMaskIntoConstraints = false
|
|
return label
|
|
}()
|
|
|
|
|
|
private lazy var iconView: UIImageView = {
|
|
let view = UIImageView()
|
|
view.contentMode = .scaleAspectFit
|
|
view.tintColor = textColor
|
|
view.translatesAutoresizingMaskIntoConstraints = false
|
|
return view
|
|
}()
|
|
|
|
|
|
private lazy var highlightIconView: UIImageView = {
|
|
let view = UIImageView()
|
|
view.contentMode = .scaleAspectFit
|
|
view.tintColor = highlightColor
|
|
view.alpha = 0
|
|
view.translatesAutoresizingMaskIntoConstraints = false
|
|
return view
|
|
}()
|
|
|
|
|
|
private lazy var HStackView: UIStackView = {
|
|
let stackView = UIStackView()
|
|
stackView.axis = .horizontal
|
|
stackView.alignment = .center
|
|
stackView.distribution = .fill
|
|
stackView.spacing = 5
|
|
stackView.translatesAutoresizingMaskIntoConstraints = false
|
|
return stackView
|
|
}()
|
|
|
|
private lazy var tapGestureRecogniser = UITapGestureRecognizer(target: self, action: #selector(didTapped))
|
|
|
|
|
|
//MARK:- Functions
|
|
|
|
init(index: Int,
|
|
icon: UIImage?,
|
|
selectedIcon: UIImage?,
|
|
name: String,
|
|
fillBasedOnWidth: Bool,
|
|
selectedColor: UIColor,
|
|
deselctedColor: UIColor,
|
|
frame: CGRect = .zero) {
|
|
|
|
self.icon = icon
|
|
self.selectedIcon = selectedIcon
|
|
self.name = name
|
|
self.fillBasedOnWidth = fillBasedOnWidth
|
|
self.index = index
|
|
super.init(frame: frame)
|
|
|
|
addLabelWithIcon()
|
|
addHighlighLabel()
|
|
addHigHighlightIconIfExist()
|
|
assignValues()
|
|
|
|
addGestureRecognizer(tapGestureRecogniser)
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
|
|
private func addLabelWithIcon() {
|
|
addSubview(iconView)
|
|
|
|
// 设置 iconView 的大小和位置
|
|
iconView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
|
|
iconView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
|
|
iconView.widthAnchor.constraint(equalToConstant: 100).isActive = true
|
|
iconView.heightAnchor.constraint(equalToConstant: 100).isActive = true
|
|
|
|
// 将 label 添加到 iconView 上
|
|
iconView.addSubview(label)
|
|
|
|
// 将 label 居中到 iconView 的 X 和 Y 轴上
|
|
label.centerXAnchor.constraint(equalTo: iconView.centerXAnchor).isActive = true
|
|
label.centerYAnchor.constraint(equalTo: iconView.centerYAnchor).isActive = true
|
|
|
|
// 确保 label 的宽度和高度适配内容
|
|
label.widthAnchor.constraint(lessThanOrEqualTo: iconView.widthAnchor).isActive = true
|
|
label.heightAnchor.constraint(lessThanOrEqualTo: iconView.heightAnchor).isActive = true
|
|
}
|
|
|
|
|
|
|
|
private func addHighlighLabel() {
|
|
addSubview(highlightLabel)
|
|
highlightLabel.centerYAnchor.constraint(equalTo: label.centerYAnchor).isActive = true
|
|
highlightLabel.centerXAnchor.constraint(equalTo: label.centerXAnchor).isActive = true
|
|
highlightLabel.widthAnchor.constraint(equalTo: label.widthAnchor).isActive = true
|
|
highlightLabel.heightAnchor.constraint(equalTo: label.heightAnchor).isActive = true
|
|
}
|
|
|
|
private func addHigHighlightIconIfExist() {
|
|
if selectedIcon == nil { return }
|
|
|
|
addSubview(highlightIconView)
|
|
highlightIconView.centerYAnchor.constraint(equalTo: iconView.centerYAnchor).isActive = true
|
|
highlightIconView.centerXAnchor.constraint(equalTo: iconView.centerXAnchor).isActive = true
|
|
highlightIconView.widthAnchor.constraint(equalTo: iconView.widthAnchor).isActive = true
|
|
highlightIconView.heightAnchor.constraint(equalTo: iconView.heightAnchor).isActive = true
|
|
|
|
}
|
|
|
|
private func assignValues() {
|
|
iconView.image = icon
|
|
label.text = name
|
|
highlightLabel.text = name
|
|
highlightIconView.image = selectedIcon
|
|
}
|
|
|
|
@objc private func didTapped() {
|
|
delegate?.itemDidSelected(self, withIndex: index)
|
|
}
|
|
|
|
}
|