Swift Control DateSelection(日期选择框)

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

Swift Control DateSelection(日期选择框) 下载链接

文章目录

效果

使用

bash 复制代码
import UIKit
import SnapKit
import Alamofire

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
       
 
        guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
              let window = windowScene.windows.first else { return }
        
        DateSelectionView.showCurrentView(
            win: window,
            valueBlock: { date in
                // 处理选择的日期
                print("选择了日期:\(date)")
            }
        )
    }

}

封装代码

bash 复制代码
import UIKit
import SnapKit

class DateSelectionView: UIView {
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    init() {
        
        let targetRect = CGRect(
            x: 0,
            y: 0,
            width: UIScreen.main.bounds.width,
            height: UIScreen.main.bounds.height
        )
        
        super.init(frame: targetRect)
        
        buildUI()
    }
    
    private var valueBlock: ((_ date:Date)->())?
    
    // MARK: - Background Button
    
    lazy private var button: UIButton = {
        let btn = UIButton(type: .custom)
        btn.backgroundColor = .clear
        btn.addTarget(self, action: #selector(buttonClick), for: .touchUpInside)
        return btn
    }()
    
    // MARK: - Bottom Content
    
    lazy private var bgView: UIView = {
        let view = UIView()
        view.backgroundColor = .white
        view.clipsToBounds = true
        view.layer.cornerRadius = 22
        view.layer.maskedCorners = [
            .layerMinXMinYCorner,
            .layerMaxXMinYCorner
        ]
        return view
    }()
    
    // MARK: - Close
    
    lazy private var closeButton: UIButton = {
        let btn = UIButton(type: .custom)
        btn.setImage(UIImage(named: "payment_close"), for: .normal)
        btn.addTarget(self, action: #selector(closeButtonClick), for: .touchUpInside)
        return btn
    }()
    
    lazy private var datePicker: UIDatePicker = {
        let picker = UIDatePicker()
        picker.datePickerMode = .date
        if #available(iOS 13.4, *) {
            picker.preferredDatePickerStyle = .wheels
        }
        picker.locale = Locale(identifier: "zh_CN")
        return picker
    }()
    
    lazy private var confirmButton: UIButton = {
        let btn = UIButton(type: .custom)
        btn.setTitle("确定", for: .normal)
        btn.setTitleColor(.white, for: .normal)
        btn.backgroundColor = .orange
        btn.layer.cornerRadius = 22
        btn.addTarget(self, action: #selector(confirmButtonClick), for: .touchUpInside)
        return btn
    }()
    
    // MARK: - Show
    
    static func showCurrentView(
        win: UIWindow,
        valueBlock: ((Date)->())?
    ) {
        let selfView = DateSelectionView()
        selfView.valueBlock = valueBlock
        win.addSubview(selfView)
        selfView.showView()
    }
    
    // MARK: - UI
    
    func buildUI() {
        
        backgroundColor = .clear
        
        addSubview(button)
        button.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
        
        button.addSubview(bgView)
        bgView.snp.makeConstraints { make in
            make.left.right.bottom.equalToSuperview()
            make.height.equalTo(370)
        }
        
        // close
        bgView.addSubview(closeButton)
        closeButton.snp.makeConstraints { make in
            make.top.equalToSuperview().offset(20)
            make.right.equalToSuperview().offset(-20)
            make.width.height.equalTo(26)
        }
        
        bgView.addSubview(datePicker)
        datePicker.snp.makeConstraints { make in
            make.top.equalTo(closeButton.snp.bottom).offset(5)
            make.left.right.equalToSuperview()
            make.height.equalTo(250)
        }
        
        bgView.addSubview(confirmButton)
        confirmButton.snp.makeConstraints { make in
            make.left.equalToSuperview().offset(20)
            make.right.equalToSuperview().offset(-20)
            make.bottom.equalToSuperview().offset(-30)
            make.height.equalTo(44)
        }
        
    }
    
    // MARK: - Show
    
    func showView() {
        
        bgView.transform = CGAffineTransform(
            translationX: 0,
            y: UIScreen.main.bounds.height
        )
        
        UIView.animate(withDuration: 0.3) {
            self.backgroundColor = .black.withAlphaComponent(0.45)
            self.bgView.transform = .identity
        }
    }
    
    // MARK: - Dismiss
    
    func dismissView() {
        
        UIView.animate(withDuration: 0.25, animations: {
            self.backgroundColor = .clear
            
            self.bgView.transform = CGAffineTransform(
                translationX: 0,
                y: UIScreen.main.bounds.height
            )
            
        }) { _ in
            self.removeFromSuperview()
        }
    }
    
    // MARK: - Action
    
    @objc func buttonClick() {
        dismissView()
    }
    
    @objc func closeButtonClick() {
        dismissView()
    }
    
    @objc private func confirmButtonClick() {
        valueBlock?(datePicker.date)

        dismissView()
    }
    
}
相关推荐
可乐鸡翅yeah_12 小时前
hls.js 切换多个视频源,新手开发常见踩坑
开发语言·前端·javascript·ios·ffmpeg·音视频·safari
传奇开心果编程12 小时前
【Flutter入门练中学】第8课:动画与过渡
android·学习·flutter·ui·ios
传奇开心果编程14 小时前
【Flutter入门练中学】第11课:状态管理进阶与声明式路由
android·学习·flutter·ui·ios
JasonSJX14 小时前
四端自建播放器怎么落地:Android、iOS、tvOS、Tizen 的 DRM 播放 SDK 技术盘点
android·ios·音视频·视频防录屏·加密保护课程·直播安全
茶底世界之下17 小时前
HDR 曲线为什么必须显式决定:端点钳位还是线性外推
ios
茶底世界之下1 天前
导出进度不是一个百分比:AVFoundation 收尾阶段的状态建模
ios·swift
大熊猫侯佩1 天前
macOS27 上可变界面尺寸 iOS App 揭秘
macos·ios·swiftui
用户2181697049301 天前
LLVM
ios
茶底世界之下1 天前
为什么媒体源不能在回调仍执行时提前报告 finish?
swift
zeqinjie1 天前
Flutter 获取 iPhone Duo 预留区位置
前端·flutter·ios