带日期选择器工具栏的iOS 14错误

问题描述

工具栏高于日期选择器,这是一个错误吗?还是我做错了什么?

我的代码

class ViewController: UIViewController {
    
    @IBOutlet weak var textField: UITextField!
    
    let datePicker = UIDatePicker()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        showDatePicker()
    }
    
    func showDatePicker(){
        //Formate Date
        datePicker.datePickerMode = .date
        datePicker.preferredDatePickerStyle = .compact
        
        //ToolBar
        let toolbar = UIToolbar();
        toolbar.sizetoFit()
        let doneButton = UIBarButtonItem(title: "Done",style: .plain,target: self,action: #selector(donedatePicker));
        let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace,target: nil,action: nil)
        let cancelButton = UIBarButtonItem(title: "Cancel",action: #selector(cancelDatePicker));
        
        toolbar.setItems([doneButton,spaceButton,cancelButton],animated: false)
        
        textField.inputAccessoryView = toolbar
        textField.inputView = datePicker
        
    }
    
    @objc func donedatePicker(){
        
        let formatter = DateFormatter()
        formatter.dateFormat = "dd/MM/yyyy"
        textField.text = formatter.string(from: datePicker.date)
        self.view.endEditing(true)
    }
    
    @objc func cancelDatePicker(){
        self.view.endEditing(true)
    }
}

是的,我知道我可以回到preferredDatePickerStyle = .wheels,但有趣的是为什么它会像这样

解决方法

确实有必要将UIDatePicker.preferredDatePickerStyle设置为.wheels,但这还不够。

为了显示选择器,您还必须设置框架,例如以下代码片段:

group(2)
,

您可以通过此实现您的要求

客观C

 if (@available(iOS 13.4,*)) {
        datePicker.preferredDatePickerStyle = UIDatePickerStyleWheels;
        [datePicker sizeToFit];
    }

在Swift

    if #available(iOS 13.4,*) {
        datePicker.preferredDatePickerStyle = .wheels
        datePicker.sizeToFit()
    }
,

您可以尝试

 if #available(iOS 13.4,*) {
    datePicker.preferredDatePickerStyle = .wheels
    datePicker.backgroundColor = UIColor.white
 }
,

解决了此问题。我尝试了下面的代码。

希望如此对您有帮助。祝你好运!!!

        datePicker.datePickerMode = UIDatePicker.Mode.date
        let gregorian: NSCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!
        let currentDate: NSDate = NSDate()
        let components: NSDateComponents = NSDateComponents()
        
        components.year =  -1
        let minDate: NSDate = gregorian.date(byAdding: components as DateComponents,to: currentDate as Date,options: NSCalendar.Options(rawValue: 0))! as NSDate
        
        datePicker.minimumDate = minDate as Date
        if #available(iOS 13.4,*) {
            datePicker.frame = CGRect(x: 0,y: 0,width: self.view.bounds.width,height: 72.0)
            
        } else {
            // Fallback on earlier versions
        }
        dateField.inputView = datePicker
        
        let toolbar = UIToolbar();
        toolbar.sizeToFit()
        
        //done button & cancel button
        let doneButton = UIBarButtonItem(title: "Done",style: UIBarButtonItem.Style.done,target: self,action: #selector(ReservationTableViewController.doneDatePicker))
        let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace,target: nil,action: nil)
        let cancelButton = UIBarButtonItem(title: "Cancel",style: UIBarButtonItem.Style.plain,action: #selector(ReservationTableViewController.cancelDatePicker))
        
        toolbar.setItems([doneButton,spaceButton,cancelButton],animated: false)
        
        
        // add toolbar to textField
        self.dateField.inputAccessoryView = toolbar
        
        datePicker.addTarget(self,action: #selector(ReservationTableViewController.datePickerValueChanged),for: UIControl.Event.valueChanged)