前言:
UIDatePicker是比較常用的一個控件了璧瞬,但是蘋果卻只提供極少的屬性可以讓我們使用户辫,所以實際運用中難免要自定義。這里我提供倆種方法來改變UIDatePicker的顯示字體顏色嗤锉。顯示效果如下:
屏幕快照 2017-12-07 下午11.06.45.png
首先是第一種方法:runtime
我們知道渔欢,runtime可以遍歷一個對象的所有屬性,雖然蘋果沒有公開UIDatePicker的字體顏色瘟忱,但是我們可以遍歷查找對應(yīng)的屬性名奥额,并加以修改就可以實現(xiàn)了。
關(guān)鍵代碼:
//MARK:runtime遍歷所有屬性名访诱,并加以修改
func setDateTextColor(picker:UIDatePicker){
var count:UInt32 = 0
let propertys = class_copyPropertyList(UIDatePicker.self, &count)
for index in 0..<count {
let i = Int(index)
let property = propertys![i]
let propertyName = property_getName(property)
let strName = String.init(cString: propertyName, encoding: String.Encoding.utf8)
if strName == "textColor"{
picker.setValue(UIColor.red, forKey: strName!)
}
}
}
第二種方法:自定義UIPickerView
相比而言垫挨,UIPickerView可以使用比較多的屬性進行操作,所以我們不妨曲線救國触菜,使用UIPickerView來實現(xiàn)UIDatePicker的功能九榔。此方法比較繁瑣,但是可以高度自定義涡相。
具體思路:
- 準(zhǔn)備3個數(shù)組存放年哲泊,月,日的數(shù)據(jù)漾峡,其中日的數(shù)組要根據(jù)相應(yīng)的年和月來處理不同情況攻旦,月份還有閏年都會影響到,所以這一步需要小心計算生逸。
/// 計算每個月的天數(shù)
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
}
- 數(shù)據(jù)源準(zhǔn)備好后牢屋,就開始實現(xiàn)UIPickerView的代理方法吧,切換年或者月份的時候會影響到日這一列的數(shù)據(jù)槽袄。
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
}
這樣就大功告成了遍尺。
結(jié)語:Swift和OC在使用上還是有不少區(qū)別的截酷,我剛用的時候也踩了不少坑,不過對于數(shù)據(jù)類型的使用確實比較嚴(yán)謹(jǐn)乾戏,感覺程序應(yīng)該會更健壯了迂苛。
github項目地址: https://github.com/wang-qiuyu/CustomDatePicker