如何在iOS 14 - Swift中居中新的日期选择器

3
有没有办法将这个日期选择器居中显示?它被设置为我的UIAlertController的ContentViewController。我想要它在这里居中显示:
1个回答

1

如果有人感兴趣,我能够使用StackViews将其居中在UIAlertController的ContentViewController上

final class DatePickerViewController: UIViewController {
  
  private var completion: ((Date)->Void)? = nil
  
  lazy var datePicker: UIDatePicker = { [weak self] in
    let dp = UIDatePicker()
    dp.addTarget(self, action: #selector(DatePickerViewController.actionForDatePicker), for: .valueChanged)
    return dp
  }()
  
  required init(mode: UIDatePicker.Mode, date: Date = Date(), completion: ((Date)->Void)? = nil) {
    super.init(nibName: nil, bundle: nil)
    datePicker.datePickerMode = mode
    datePicker.date = date
    self.completion = completion
  }
  
  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
  
  deinit {
    Log.info("De-Init Date Picker VC")
  }
  
  override func loadView() {
    if #available(iOS 13.4, *) {
      let spacerViewLeading = UIView()
      let spacerViewTrailing = UIView()
      
      let sv = UIStackView(arrangedSubviews: [spacerViewLeading, datePicker, spacerViewTrailing])
      sv.axis = .horizontal
      sv.distribution = .fill
      
      datePicker.centerXAnchor.constraint(equalTo: sv.centerXAnchor).isActive = true
      view = sv
      
      if datePicker.datePickerMode == .dateAndTime {
        spacerViewLeading.widthAnchor.constraint(equalTo: spacerViewTrailing
                                                  .widthAnchor, constant: ((datePicker.frame.width - view.frame.width)/2) - 10).isActive = true
      } else if datePicker.datePickerMode == .time || datePicker.datePickerMode == .date {
        sv.distribution = .fillEqually
      }
    } else {
      view = datePicker
    }
  }
  
  @objc func actionForDatePicker() {
    completion?(datePicker.date)
  }
}

在警报上的辅助方法,将其添加到UIVlertView的ContentViewController中:

  extension UIAlertController {
    func setContentViewController(vc: UIViewController, height: CGFloat? = nil) {
      setValue(vc, forKey: "contentViewController")
        
      if let height = height {
        vc.preferredContentSize.height = height
        preferredContentSize.height = height
      }
    }
  }

实际运用:

let alert = UIAlertController(title: "This is an alert", message: "This is the message", preferredStyle: .alert)
let datePickerVc = DatePickerViewController(mode: UIDatePicker.Mode.dateAndTime)
datePickerVc.datePicker.date = (Calendar.current as NSCalendar).date(bySettingHour: 7, minute: 0, second: 0, of: Date(), options: .matchFirst) ?? Date()
alert.setContentViewController(vc: datePickerVc)

这并不实际上将日期选择器居中:日期选择器元素仍将右对齐于其所在的中心堆栈单元格内。但是,如果您的堆栈视图宽度大约是日期选择器元素的3倍,则它看起来大致居中。 - ninjoncrak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接