【问题标题】:iOS 14 bug with date picker toolbar带有日期选择器工具栏的 iOS 14 错误
【发布时间】:2023-04-07 12:00:02
【问题描述】:

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

我的代码:

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", style: .plain, target: self, 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,但有趣的是它为什么会这样

【问题讨论】:

  • 你发现了吗?
  • 不,还是什么都没有,只是回滚到 .wheels
  • datePicker = UIDatePicker() datePicker.datePickerMode = .date if #available(iOS 14, *) { datePicker.preferredDatePickerStyle = .wheels datePicker.sizeToFit() } datePicker.addTarget(self, action: #选择器(self.handleDatePicker),用于:.valueChanged) inputView = datePicker

标签: swift datepicker storyboard toolbar ios14


【解决方案1】:

您可以由此实现您的要求

目标 C

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

在斯威夫特中

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

【讨论】:

  • @Serj Semenov 找出上面的答案,我希望它会起作用。
【解决方案2】:

你可以试试

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

【讨论】:

    【解决方案3】:

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

    为了显示选择器,您还必须设置框架,例如 sn-p:

    if #available(iOS 13.4, *) {
    
        picker.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 250.0)
        picker.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 250.0)
        picker.preferredDatePickerStyle = .wheels
        picker.preferredDatePickerStyle = .wheels
    }
    

    【讨论】:

      【解决方案4】:

      修复了这个问题。我试过下面的代码。

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

              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, target: self, 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)
      

      【讨论】:

      • 好吧,你基本上只是添加了“datePicker.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 72.0)”但是如果有什么会改变的话您需要更改这部分,仅对高度进行硬编码是一个糟糕的解决方案
      • 我不显示。我检查了所有不同的设备。它工作正常。
      猜你喜欢
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 2011-09-26
      • 2013-01-14
      • 1970-01-01
      • 2020-02-27
      相关资源
      最近更新 更多