DatePicker在iPhone上的UINavigationBar下运行,在iPad上运行良好

问题描述 投票:0回答:1

我有DatePickerController的以下代码:

import UIKit

@objc protocol DatePickerControllerDelegate: AnyObject {
    func datePicker(controller: DatePickerController, didSelect date: Date)
    func datepickerDidDismiss(controller: DatePickerController)
}

final class DatePickerController: UIViewController {
    @objc weak var delegate: DatePickerControllerDelegate?

    @objc public var date: Date {
        get {
            return datePicker.date
        }
        set(value) {
            datePicker.setDate(value, animated: false)
        }
    }

    @objc public lazy var datePicker: UIDatePicker = {
        let v = UIDatePicker()
        v.datePickerMode = .date
        return v
    }()

    override var preferredContentSize: CGSize {
        get {
            return datePicker.frame.size
        }

        set(newValue) {
            super.preferredContentSize = newValue
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(datePicker)
        datePicker.autoresizingMask = [.flexibleTopMargin, .flexibleRightMargin, .flexibleLeftMargin, .flexibleBottomMargin]
        view.backgroundColor = .white
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done,
                                                            target: self,
                                                            action: #selector(DatePickerController.doneButtonDidTap))

        navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel,
                                                           target: self,
                                                           action: #selector(DatePickerController.cancelButtonDidTap))
    }

    @objc private func doneButtonDidTap() {
        delegate?.datePicker(controller: self, didSelect: date)
    }

    @objc private func cancelButtonDidTap() {
        dismiss(animated: true, completion: nil)
        delegate?.datepickerDidDismiss(controller: self)
    }
}

它适用于iPad:

ipad view

然而,在iPhone上,选择器在UINavigationBar下滑动:

iphone view

用于显示DatePickerController的代码完全相同,在两种情况下风格都是UIModalPresentationStylePopover

更新:呈现DatePickerController的代码:

  @objc func presentDatePicker() {
    let picker = DatePickerController()
    let navC = UINavigationController(rootViewController: picker)
    present(navC, animated: true, completion: nil)
  }
ios user-interface uinavigationbar uidatepicker size-classes
1个回答
-1
投票

使用AutoLayout修复:

private func configureLayout() {
    datePicker.translatesAutoresizingMaskIntoConstraints = false
    [datePicker.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor),
     datePicker.leadingAnchor.constraint(equalTo: view.leadingAnchor),
     datePicker.trailingAnchor.constraint(equalTo: view.trailingAnchor),]
        .forEach{$0.isActive = true}
}
© www.soinside.com 2019 - 2024. All rights reserved.