Reputation: 131
Is there a way to center this date picker? It’s set as the ContentViewController on my UIAlertController.
I want it to be here in the center
Upvotes: 3
Views: 1202
Reputation: 131
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)
}
}
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)
Upvotes: 1