Swift 使用Runtime自定义UIDatePicker

前言:

UIDatePicker是比较常用的一个控件了,但是苹果却只提供极少的属性可以让我们使用,所以实际运用中难免要自定义。这里我提供俩种方法来改变UIDatePicker的显示字体颜色。显示效果如下:


Swift 使用Runtime自定义UIDatePicker_第1张图片
屏幕快照 2017-12-07 下午11.06.45.png

首先是第一种方法:runtime

我们知道,runtime可以遍历一个对象的所有属性,虽然苹果没有公开UIDatePicker的字体颜色,但是我们可以遍历查找对应的属性名,并加以修改就可以实现了。
关键代码:

//MARK:runtime遍历所有属性名,并加以修改
    func setDateTextColor(picker:UIDatePicker){
        var count:UInt32 = 0
        let propertys = class_copyPropertyList(UIDatePicker.self, &count)
        for index in 0..
第二种方法:自定义UIPickerView

相比而言,UIPickerView可以使用比较多的属性进行操作,所以我们不妨曲线救国,使用UIPickerView来实现UIDatePicker的功能。此方法比较繁琐,但是可以高度自定义。

具体思路:

  • 准备3个数组存放年,月,日的数据,其中日的数组要根据相应的年和月来处理不同情况,月份还有闰年都会影响到,所以这一步需要小心计算。
/// 计算每个月的天数
    fileprivate func daysCount(year:Int,month:Int) -> Int{
        let isrunNian = year%4 == 0 ? (year%100 == 0 ? (year%400 == 0 ? true:false):true):false
        if month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12{
            self.setDayArr(num: 31)
            return 31
        }else if month == 4 || month == 6 || month == 9 || month == 11{
            self.setDayArr(num: 30)
            return 30
        }else if month == 2{
            if isrunNian{
                self.setDayArr(num: 29)
                return 29
            }else{
                self.setDayArr(num: 28)
                return 28
            }
        }
        return 0
    }
  • 数据源准备好后,就开始实现UIPickerView的代理方法吧,切换年或者月份的时候会影响到日这一列的数据。
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if component == 0 {
            yearIndex = row
        }
        if component == 1 {
            monthIndex = row
        }
        if component == 2 {
            dayIndex = row
        }
        if component == 0 || component == 1{
            let selctYear = (yearArray![yearIndex!] as! NSString).intValue
            let selctMonth = (monthArray![monthIndex!] as! NSString).intValue
            let _ = self.daysCount(year: Int(selctYear) , month: Int(selctMonth))
            
            if (dayArray?.count)!-1 < dayIndex! {
                dayIndex = (dayArray?.count)!-1
            }
        }
        pickerView.reloadAllComponents()
    }
  • 最后别忘了我们的初衷,就是自定义显示字体颜色。重写
    pickerView viewForRow: forComponent:(NSInteger)component reusingView:方法
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
        let headLabel = UILabel.init()
        headLabel.textColor  = UIColor.red
        headLabel.textAlignment = NSTextAlignment.center
        if component == 0 {
            headLabel.text = yearArray?[row] as? String
        }
        if component == 1 {
            headLabel.text = monthArray?[row] as? String
        }
        if component == 2 {
            headLabel.text = dayArray?[row] as? String
        }
        return headLabel
  }

这样就大功告成了。


结语:Swift和OC在使用上还是有不少区别的,我刚用的时候也踩了不少坑,不过对于数据类型的使用确实比较严谨,感觉程序应该会更健壮了。

github项目地址: https://github.com/wang-qiuyu/CustomDatePicker

你可能感兴趣的:(Swift 使用Runtime自定义UIDatePicker)