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()
    }
    
}
相关推荐
叫Guava不是瓜娃15 小时前
我用 Swift 写了个本地语音输入:按住说话,松开就是整理好的文字(开源)
swift
茶底世界之下18 小时前
林间步道要不要加暗角?用 Awaking 把强度收在20%
前端·ios·图片资源
season_zhu18 小时前
Skills For Real Engineers 系列之一:先配好项目,再让 ask-matt 帮我选技能
ios·openai·ai编程
疯狂敲代码的老刘21 小时前
d2r-mobile:3.2千星开源暗黑破坏神2 iOS兼容层,3天冲上GitHub日榜
ios·github
黑科技iOS上架1 天前
App Store5.6隐藏功能究竟怎么排查?
ios·审核
Yannik2 天前
iOS Swift Package Manager(SPM)私有组件完整实操
ios·swift
随遇丿而安2 天前
第 4 周:28KB 的 PNG 占了 8MB 内存,因为图片内存看尺寸不看文件大小
ios
leizhen198408092 天前
Vibe Coding:门槛降了,但判断力成了新的门槛
人工智能·安全·ios
我就是不信2 天前
Swift 方法派发机制详解
开发语言·ios·swift
AIsoft_86892 天前
科会通录音工具倍速回放怎么切换速度
ios·智能手机