在 Swift 中编写一个固定在屏幕底部的 UIDate Picker

Programming a UIDate Picker to be fixed at the bottom of the screen in Swift

我正在尝试将 UIDatePicker 添加到一组已经存在的文本字段中。即使在尝试了我在 Whosebug 上看到的所有解决方案后,我也无法将 UI 日期选择器设置到屏幕底部。我正在使用 MVVM 模型,我已经创建了一个单独的文件来创建 Picker 视图。

class UAFieldDatePickerView: UIStackView {....}

extension UAFieldDatePickerView {
    @objc private func didTapDateView() {
        guard viewModel.state.value != .disabled else {
            return
        }
        let datePicker = UIDatePicker()
        datePicker.frame = CGRect(x: 0, y: UIScreen.main.bounds.height - 200, width: self.frame.size.width, height: 200)
        datePicker.backgroundColor = UIColor.UANeutralGray05
        datePicker.datePickerMode = .date
        datePicker.date = Calendar.current.date(byAdding: .day, value: -1, to: Date())!
        datePicker.addTarget(self, action: #selector(datePickerValueChanged(_:)), for: .valueChanged)
        self.addSubview(datePicker)
    }

    @objc func datePickerValueChanged(_ datePicker: UIDatePicker) {
        datePicker.maximumDate = Date()
    }
}

我遇到的问题是无法将 DatePicker 固定到屏幕底部。我如何才能确保框架始终固定在底部。

UIDatePicker 派生自 UIControl,这意味着它也是 UIView 的子类,并且它遵循与任何其他视图相同的规则。如果你想要一个位于屏幕底部的日期选择器,那么你需要把它放在那里。

datePicker.frame = CGRect(x: 0, y: UIScreen.main.bounds.height - 200, width: self.frame.size.width, height: 200)

在这里,您将日期选择器的垂直位置设置为屏幕高度减去选择器的高度。但是您不是将选择器添加到屏幕,而是将其添加到 self。如果您希望选择器位于要添加它的视图的底部,那么您应该根据该视图计算高度,而不是根据可能具有或可能不具有相同尺寸的其他东西。由于您要将选择器添加到 self,请使用 self.bounds.size.height 计算位置:

datePicker.frame = CGRect(x: 0, y: self.bounds.size.height - 200, width: self.bounds.size.width, height: 200)

如果您希望选择器位于 屏幕底部 ,则采取措施确保包含它的视图位于屏幕底部,或以不同的方式显示选择器。 CZ54 在评论中使用选择器作为输入视图的建议很好;做类似事情的更通用的方法是从屏幕底部模态显示日期选择器。