利用Runtime修改UIdatePicker的字体颜色
- 用過蘋果原生UIdatePicker的Ios開發者都知道,UIdatePicker這個時間選擇器的字體顏色默認的是黑色,并且官方API并沒有提供可以修改字體顏色的API。如下:
做到上面這個效果,我主要進行了如下步驟:
以上代碼中pProperty返回的是一個所有屬性的數組,通過循環遍歷我發現@”textColor”這個屬性應該就是我想要的屬性,然后通過setValue賦值白色,最后就做到了上圖的結果。
或許說干過兩年ios開發的都知道這個東西,但是筆者更想表達的還是這種分析問題和處理問題并最終解決問題的思想,當我們修改系統原生控件遇到瓶頸的時候可以采用這種方法來學習這個控件更多的特性
如果你覺得不過癮?那就繼續吧,更刺激的還在后面呢~
本來這個地方做好之后,結果測試測出一個非常奇葩的bug,就是UIDatepicker在當天的字體仍然是黑色。
-如下圖
看到了么,因為我在寫這篇文章的時候是九月一號,所以九月一號的字體還是以前的黑色,比如說我動態改變系統日期為九月二號,它也會自動變成九月二號的字體是黑色,由于UI設計的是背景黑色,所以這里根本就看不清,嚴重影響產品體驗。通過一系列的糾結,我最后發現,如果UIDatepicker設置了最大時間(maxDate)和最小時間(minDate)就會這樣,如果不設置就不出現這種情況,但是需求要限制最大時間和最小時間。
在這個解決的過程中,我試過了遍歷屬性還有查看官方API都找不到任何資料,甚至都想不通蘋果內部是怎么處理的這么牛逼的。
實在沒辦法,我到處百度還是沒進展,最后我終于在國外的網站找老外解決了這個問題(老外為啥比國人要牛逼呢?)
解決這個問題的核心代碼如下:
通過這個代碼我不斷的逆向推理其實現原理,并且各種百度查找NSInvocation的相關資料。
最后讓我逐步來解析一下每一行代碼的意思:
SEL selector =NSSelectorFromString(@”setHighlightsToday:”);
通過Runtime的NSSelectorFromString利用字符串獲取方法@”setHighlightsToday:”(注意,看這個方法名就是今天的高亮顯示開關,注意字符串后面的冒號,表示這個方法是有參數的)
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDatePicker instanceMethodSignatureForSelector:selector]];
用這個SEL創建UIdatepicker類的NSMethodSignature來創建一個NSInvocation。
BOOL no = NO;
[invocation setSelector:selector];
[invocation setArgument:&no atIndex:2];
[invocation invokeWithTarget:picker];
給invocation設置參數,設置target,并且動態調用設置參數NO(蘋果默認YES并且不開放)
其實NSInvocation也是Runtime的一種方式。
注意[invocation setArgument:&no atIndex:2];這個2是怎么來的,因為setArgument中第一個參數的類picker,第二個參數是SEL,所以我們自己的參數最小的數字就是2,也就是這個方法的第一個參數
最后問題徹底解決了,曬張截圖求真相:
雖然問題是最終解決了,但是假如下次我們又遇到這種類似的問題應該怎么辦呢?難道又要焦頭爛額的到處尋求援助么?程序員的上進心和求學心哪里去了?
最后筆者花了一到兩天的時間一直思考這個問題,并最終通過分析老外的解決方式逆向找到解決的具體原理
前面說過,可以通過NSString *getPropertyName = [NSString stringWithCString:property_getName(pProperty[i]) encoding:NSUTF8StringEncoding];來獲取一個類所有的屬性,最后我在Runtime的API中發現,也可以獲取一個類所有的方法(有興趣的可以去了解一下IMP指針)。
unsigned int outCount;int i;Method *method = class_copyMethodList([UIDatePicker class],&outCount);也就是說,利用Rumtime遍歷某個類的所有屬性和所有的方法,蘋果的API限制在我們面前形同虛設,可以解決更多的一些原生API不開放的東西,其實這里也可以自己重寫,不過相當麻煩,而且會有復雜的內存問題,所以還是直接用Runtime繞過蘋果限制修改原生控件簡單的多
其實runtime本身的東西很少,更多的是一些概念性的東西,有興趣的也可以去了解一下runtime,本文主要講的是一種利用runtime去解決實際問題的思維方式。
歡迎大家轉載學習并且指出筆者不到之處,轉載請注明出處哈!
總結
以上是生活随笔為你收集整理的利用Runtime修改UIdatePicker的字体颜色的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS安装CocoaPods完整流程
- 下一篇: IOS8如何获取当前UIViewCont