prank/Funny_sounds/Tool/CustomPickerView.swift
2024-09-03 09:38:34 +08:00

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
}
}