一次可以 select 两次的自定义选择器
Custom picker which can able to select two times at a time
如何在 iOS 中设计此屏幕。
一次可以select两次,如果可以的话是什么方法?
我搜索了很多,但没有找到任何自定义 UIDatePicker 的例子,但你可以查看这个 link 并创建你自己的选择器它不会是那个特定的日期选择器,但它将是一个选择器视图,您可以根据您的要求对其进行编码。
iOS Programming Recipe 9: Adding Multiple Columns to UIPickerView
我希望最好使用标签栏类型的选择器视图,我们可以通过 2 个不同的按钮处理开始日期和结束日期。我已经展示了一个示例图像。希望你能从给出的图片中理解。
When starts
Button is selected the UIDatePicker
will vary the start date label
and when ends
button is selected the UIDatePicker
will vary the end日期 label
。
谢谢@Sudhin Davis,这是个好主意,但最后我决定继续 UI,没有任何改变。我从@Harry 的评论中找到了解决方案。这是我修复它的方法
let maxV = 25000
override func awakeFromNib() {
self.pickerVIew.delegate = self
self.pickerVIew.dataSource = self
self.pickerViewLoaded(0, component: 0)
self.pickerViewLoaded(0, component: 1)
self.pickerViewLoaded(0, component: 3)
self.pickerViewLoaded(0, component: 4)
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int
{
return 6
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
if(component == 2 || component == 5)
{
return 2
}
else
{
return maxV
}
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String!
{
if(component == 0 || component == 3)
{
return String(format: "%02d", (row%12)+1)
}
else if(component == 1 || component == 4)
{
return String(format: "%02d", (row%12)*5)
}
else
{
return row == 0 ? "AM" : "PM"
}
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
self.pickerViewLoaded(row,component: component)
}
func pickerViewLoaded(row:Int,component:Int)
{
var base12 = (maxV/2)-(maxV/2)%12;
self.pickerVIew.selectRow(row%12+base12, inComponent: component, animated: false)
}
您可以创建一个包含 2 个 UIDatePickers 的自定义视图并将它们放在 UIStackView 中,您也可以在上面添加标签。这是一个示例视图:
class IntervalPickerView: BaseView {
@IBOutlet weak var startDatePicker: UIDatePicker!
@IBOutlet weak var endDatePicker: UIDatePicker!
weak var delegate: IntervalPickerDelegate?
override func postInit() {
startDatePicker.addTarget(self, action: #selector(datePickerValueChanged(_:)), for: .valueChanged)
endDatePicker.addTarget(self, action: #selector(datePickerValueChanged(_:)), for: .valueChanged)
}
@objc func datePickerValueChanged(_ sender: UIDatePicker){
let dateFormatter: DateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
let selectedTime = dateFormatter.string(from: sender.date)
delegate?.didPickTime(selectedTime, isStart: sender == startDatePicker)
}
}
如何在 iOS 中设计此屏幕。
一次可以select两次,如果可以的话是什么方法?
我搜索了很多,但没有找到任何自定义 UIDatePicker 的例子,但你可以查看这个 link 并创建你自己的选择器它不会是那个特定的日期选择器,但它将是一个选择器视图,您可以根据您的要求对其进行编码。
iOS Programming Recipe 9: Adding Multiple Columns to UIPickerView
我希望最好使用标签栏类型的选择器视图,我们可以通过 2 个不同的按钮处理开始日期和结束日期。我已经展示了一个示例图像。希望你能从给出的图片中理解。
When starts
Button is selected the UIDatePicker
will vary the start date label
and when ends
button is selected the UIDatePicker
will vary the end日期 label
。
谢谢@Sudhin Davis,这是个好主意,但最后我决定继续 UI,没有任何改变。我从@Harry 的评论中找到了解决方案。这是我修复它的方法
let maxV = 25000
override func awakeFromNib() {
self.pickerVIew.delegate = self
self.pickerVIew.dataSource = self
self.pickerViewLoaded(0, component: 0)
self.pickerViewLoaded(0, component: 1)
self.pickerViewLoaded(0, component: 3)
self.pickerViewLoaded(0, component: 4)
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int
{
return 6
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
if(component == 2 || component == 5)
{
return 2
}
else
{
return maxV
}
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String!
{
if(component == 0 || component == 3)
{
return String(format: "%02d", (row%12)+1)
}
else if(component == 1 || component == 4)
{
return String(format: "%02d", (row%12)*5)
}
else
{
return row == 0 ? "AM" : "PM"
}
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
self.pickerViewLoaded(row,component: component)
}
func pickerViewLoaded(row:Int,component:Int)
{
var base12 = (maxV/2)-(maxV/2)%12;
self.pickerVIew.selectRow(row%12+base12, inComponent: component, animated: false)
}
您可以创建一个包含 2 个 UIDatePickers 的自定义视图并将它们放在 UIStackView 中,您也可以在上面添加标签。这是一个示例视图:
class IntervalPickerView: BaseView {
@IBOutlet weak var startDatePicker: UIDatePicker!
@IBOutlet weak var endDatePicker: UIDatePicker!
weak var delegate: IntervalPickerDelegate?
override func postInit() {
startDatePicker.addTarget(self, action: #selector(datePickerValueChanged(_:)), for: .valueChanged)
endDatePicker.addTarget(self, action: #selector(datePickerValueChanged(_:)), for: .valueChanged)
}
@objc func datePickerValueChanged(_ sender: UIDatePicker){
let dateFormatter: DateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
let selectedTime = dateFormatter.string(from: sender.date)
delegate?.didPickTime(selectedTime, isStart: sender == startDatePicker)
}
}