首页 > 解决方案 > 在 Swift 中将 UIDate Picker 编程为固定在屏幕底部

问题描述

我正在尝试将 UIDatePicker 添加到已经存在的一组文本字段中。即使尝试了我在 StackOverflow 上看到的所有解决方案,我也无法将 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 固定到屏幕底部。我将如何确保框架始终固定在底部。

标签: iosobjective-cxcodeswift5

解决方案


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 在评论中建议使用选择器作为输入视图是一个很好的建议;执行类似操作的更通用方法是从屏幕底部模态显示日期选择器。


推荐阅读