170 lines
5.3 KiB
Swift
170 lines
5.3 KiB
Swift
//
|
|
// CustomPickerView.swift
|
|
// Funny_sounds
|
|
//
|
|
// Created by 忆海16 on 2024/8/16.
|
|
//
|
|
|
|
import UIKit
|
|
import SnapKit
|
|
|
|
class CustomPickerView: UIView, UIPickerViewDelegate, UIPickerViewDataSource {
|
|
|
|
private let pickerValues = [5, 10,15,20,30,35,45,55,60,70,80,90]
|
|
private var selectedValue: Int = 15
|
|
|
|
private let pickerView = UIPickerView()
|
|
private let cancelButton = UIButton()
|
|
private let okButton = UIButton()
|
|
|
|
var onValueSelected: ((Int) -> Void)?
|
|
|
|
override init(frame: CGRect) {
|
|
super.init(frame: frame)
|
|
setupView()
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
super.init(coder: coder)
|
|
setupView()
|
|
}
|
|
|
|
private func setupView() {
|
|
self.backgroundColor = .white
|
|
self.layer.cornerRadius = 10
|
|
self.clipsToBounds = true
|
|
|
|
setupPickerView()
|
|
setupButtons()
|
|
}
|
|
|
|
private func setupPickerView() {
|
|
pickerView.delegate = self
|
|
pickerView.dataSource = self
|
|
pickerView.translatesAutoresizingMaskIntoConstraints = false
|
|
addSubview(pickerView)
|
|
|
|
NSLayoutConstraint.activate([
|
|
pickerView.centerXAnchor.constraint(equalTo: self.centerXAnchor),
|
|
pickerView.centerYAnchor.constraint(equalTo: self.centerYAnchor),
|
|
pickerView.widthAnchor.constraint(equalTo: self.widthAnchor),
|
|
pickerView.heightAnchor.constraint(equalTo: self.heightAnchor, constant: -50) // Adjust for buttons
|
|
])
|
|
|
|
pickerView.selectRow(pickerValues.firstIndex(of: selectedValue)!, inComponent: 0, animated: false)
|
|
}
|
|
|
|
private func setupButtons() {
|
|
|
|
var topView = UIView()
|
|
topView.backgroundColor = UIColor.hexSting(color: "#4EDB96", alpha: 1)
|
|
self.addSubview(topView)
|
|
|
|
topView.snp.makeConstraints { make in
|
|
make.width.equalToSuperview()
|
|
make.height.equalTo(46)
|
|
make.top.equalTo(self.snp.top)
|
|
}
|
|
|
|
|
|
|
|
cancelButton.setTitle("Cancel", for: .normal)
|
|
cancelButton.titleLabel?.font = UIFont(name: "PaytoneOne-Regular", size: 18)
|
|
cancelButton.setTitleColor(.white, for: .normal)
|
|
cancelButton.translatesAutoresizingMaskIntoConstraints = false
|
|
topView.addSubview(cancelButton)
|
|
|
|
cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside)
|
|
|
|
okButton.setTitle("OK", for: .normal)
|
|
okButton.setTitleColor(.white, for: .normal)
|
|
okButton.titleLabel?.font = UIFont(name: "PaytoneOne-Regular", size: 18)
|
|
okButton.translatesAutoresizingMaskIntoConstraints = false
|
|
topView.addSubview(okButton)
|
|
|
|
okButton.addTarget(self, action: #selector(okButtonTapped), for: .touchUpInside)
|
|
|
|
|
|
cancelButton.snp.makeConstraints { make in
|
|
make.left.equalTo(topView.snp.left).offset(20)
|
|
make.centerY.equalTo(topView)
|
|
|
|
}
|
|
|
|
okButton.snp.makeConstraints { make in
|
|
make.right.equalTo(topView.snp.right).offset(-20)
|
|
make.centerY.equalTo(topView)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@objc private func cancelButtonTapped() {
|
|
dismissView()
|
|
}
|
|
|
|
@objc private func okButtonTapped() {
|
|
onValueSelected?(selectedValue)
|
|
dismissView()
|
|
}
|
|
|
|
private func dismissView() {
|
|
UIView.animate(withDuration: 0.3, animations: {
|
|
self.alpha = 0
|
|
self.transform = CGAffineTransform(translationX: 0, y: self.frame.height)
|
|
}) { _ in
|
|
self.removeFromSuperview()
|
|
}
|
|
}
|
|
|
|
func showInView(_ parentView: UIView) {
|
|
self.frame = CGRect(x: 0, y: parentView.bounds.height, width: parentView.bounds.width, height: 262)
|
|
parentView.addSubview(self)
|
|
|
|
UIView.animate(withDuration: 0.3) {
|
|
self.alpha = 1
|
|
self.transform = CGAffineTransform(translationX: 0, y: -self.frame.height)
|
|
}
|
|
}
|
|
|
|
// Picker View Delegate & Data Source methods
|
|
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
|
|
return pickerValues.count
|
|
}
|
|
|
|
func numberOfComponents(in pickerView: UIPickerView) -> Int {
|
|
return 1
|
|
}
|
|
|
|
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
|
|
return "\(pickerValues[row])s"
|
|
}
|
|
|
|
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
|
|
let label = BorderedLabel()
|
|
label.textAlignment = .center
|
|
label.text = "\(pickerValues[row]) s"
|
|
|
|
if row == pickerView.selectedRow(inComponent: component) {
|
|
label.font = UIFont.systemFont(ofSize: 24)
|
|
label.textColor = UIColor.black
|
|
} else {
|
|
label.font = UIFont.systemFont(ofSize: 18)
|
|
label.textColor = UIColor.white
|
|
}
|
|
|
|
return label
|
|
}
|
|
|
|
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
|
|
selectedValue = pickerValues[row]
|
|
pickerView.reloadAllComponents()
|
|
}
|
|
|
|
|
|
func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
|
|
return 40
|
|
}
|
|
}
|
|
|