使用自动约束将视图居中-Swift

使用自动约束将视图居中-Swift,swift,constraints,Swift,Constraints,我正在创建一个XIB/类的日期选择器,当用户点击一个按钮时,它会从一个调用viewController的程序中调用。如何使用自动约束将此视图放置在调用按钮的正下方并与按钮的中心对齐。我的代码以纵向方式工作,但在设备旋转时失败(日期选择器不会重新居中)。可能是因为我在视图的init上传递了一个CGRect作为参数,它在rotate上不会改变。我看不到任何其他方法可以覆盖CGRect的传递。当我添加自动约束代码时,会出现运行时自动格式化错误 视图控制器: @IBAction func showMyD

我正在创建一个XIB/类的日期选择器,当用户点击一个按钮时,它会从一个调用viewController的程序中调用。如何使用自动约束将此视图放置在调用按钮的正下方并与按钮的中心对齐。我的代码以纵向方式工作,但在设备旋转时失败(日期选择器不会重新居中)。可能是因为我在视图的init上传递了一个CGRect作为参数,它在rotate上不会改变。我看不到任何其他方法可以覆盖CGRect的传递。当我添加自动约束代码时,会出现运行时自动格式化错误

视图控制器:

@IBAction func showMyDatePicker(_ sender: Any) {
    showMyDatePicker.isEnabled = false
    let today = Date()
    let minDate = Calendar.current.date(byAdding: .month, value: -3, to: today)
    let maxDate = Calendar.current.date(byAdding: .month, value: 3, to: today)

    let datePickerWidth = 300
    let datePickerHeight = 200

    let datePickerX = Int(showMyDatePicker.center.x - CGFloat(datePickerWidth / 2))
    let datePickerY = Int(showMyDatePicker.center.y + CGFloat(showMyDatePicker.bounds.height / 2))
    let frame = CGRect(x: datePickerX, y: datePickerY, width: datePickerWidth, height: datePickerHeight)

    myDatePicker = MyDatePicker(frame: frame)
    myDatePicker?.setMyDatePicker(date: today, minimumDate: minDate!, maximumDate: maxDate!)
    myDatePicker?.delegate = self
    self.view.addSubview(myDatePicker!)

}
日期选择器类:

class MyDatePicker: UIView {

var delegate: MyDatePickerDelegate?

@IBOutlet var contentView: UIView!

@IBOutlet weak var datePicker: UIDatePicker!
@IBOutlet weak var returnButton: UIButton!

@IBAction func datePickerChanged(_ sender: Any) {
    delegate?.dateFromDatePicker(date: datePicker.date, closeDatePickerView: false)
}

@IBAction func returnButtonTapped(_ sender: Any) {
    delegate?.dateFromDatePicker(date: datePicker.date, closeDatePickerView: true)
}

override init(frame: CGRect) {
    super.init(frame: frame)
    initView()
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    initView()
}

private func initView() {//QUESTION: how can I set the datepicker initial values within here
    // Instantiate the view from xib file
    let contentView = Bundle.main.loadNibNamed("MyDatePicker", owner: self, options: nil)?.first as? UIView

    // Check that it's not nil
    guard contentView != nil else {
        return
    }

    // Add the view and set its frame
    addSubview(contentView!)
    contentView?.frame = self.bounds
    contentView?.autoresizingMask = [.flexibleHeight, .flexibleWidth]
}


func setMyDatePicker(date: Date, minimumDate: Date, maximumDate: Date) {
    datePicker.date = date
    datePicker.minimumDate = minimumDate
    datePicker.maximumDate = maximumDate
}

}

只需在
addSubview
之后添加所需的约束,并将
TAMIC
设置为false,如下所示:

@IBAction func showMyDatePicker(_ sender: UIButton) {
    // ...
    view.addSubview(myDatePicker!)
    myDatePicker.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        myDatePicker.topAnchor.constraint(equalTo: sender.bottomAnchor),
        myDatePicker.centerXAnchor.constraint(equalTo: sender.centerXAnchor)])
}

你犯了什么错误?你能分享屏幕截图吗?你试着添加什么约束?