关于ios:如何自定义UIDatePicker以实现以下输出?

How to customise UIDatePicker to achieve the following output?

enter image description here

这是一个包含日期,日期和月份作为输入的选择器,并且还可以一屏显示,是否可以通过iOS中的选择器/日期选择器实现这种功能?


在这种情况下,应将其添加为UIPickerView。假设问题将是:如何在当月的日期之前填充其值?为了更清楚一点,我将其作为步骤提及:

  • 您应该获得当前月份的开始和结束日期。您可以通过检查此答案找到实现方法。

  • 您需要在开始日期和结束日期之间使用所需的格式获取整天的时间。您可以通过检查此答案找到实现方法。

  • 获得当月的所有天数后,您可以轻松地填充日期选择器数据源方法。

实施:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

    var currentMonthDays: [String] {
        var array = [String]()

        var date = Date().startOfMonth() // first date
        let endDate = Date().endOfMonth()

        let fmt = DateFormatter()
        //fmt.dateFormat ="dd/MM/yyyy"
        fmt.dateFormat ="EEE dd MMM"

        while date <= endDate {
            date = Calendar.current.date(byAdding: .day, value: 1, to: date)!

            array.append(fmt.string(from: date))
        }

        return array
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        print(currentMonthDays)
    }

    // Picker View Data Soruce & delegate Methods

    // REMARK: make sure to connect pickerview datasource/delegate to your view controller,
    // I did it from the storyboard
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return currentMonthDays.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return currentMonthDays[row]
    }
}


// Step #1:
extension Date {
    func startOfMonth() -> Date {
        return Calendar.current.date(from: Calendar.current.dateComponents([.year, .month], from: Calendar.current.startOfDay(for: self)))!
    }

    func endOfMonth() -> Date {
        return Calendar.current.date(byAdding: DateComponents(month: 1, day: -1), to: self.startOfMonth())!
    }
}


请执行以下步骤:-
1.您必须使用DateFormatter()更改日期。
2.将所有日期(字符串格式)保存在UIPickerView Datasource方法的NSArrayNSMutableArray中。
3.然后调用UIPickerView DatasourceDelegate方法以获取结果。

对于日期转换,您可以应用以下代码。

1
2
3
4
5
6
let dateFormatter = DateFormatter()
dateFormatter.dateFormat ="EEE dd MMM"
let currentDate = NSDate()

let convertedDateString = dateFormatter.string(from:currentDate as Date)
print("convertedDate:", convertedDateString)