日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用Runtime修改UIdatePicker的字体颜色

發布時間:2024/9/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用Runtime修改UIdatePicker的字体颜色 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 用過蘋果原生UIdatePicker的Ios開發者都知道,UIdatePicker這個時間選擇器的字體顏色默認的是黑色,并且官方API并沒有提供可以修改字體顏色的API。如下:
UIDatePicker *picker = [[UIDatePicker alloc] init];picker.datePickerMode = UIDatePickerModeDate;picker.maximumDate = [NSDate dateWithTimeIntervalSince1970:0];picker.minimumDate = [NSDate dateWithTimeIntervalSinceNow:10000];[picker setDate:[NSDate date]];

做到上面這個效果,我主要進行了如下步驟:

  • 利用通過遍歷UIDatePicker類的所有屬性,包括寫在.m文件中看不到的屬性。
  • 找到蘋果用于修改字體顏色的屬性使用rumtime動態修改。
  • unsigned int outCount;int i;objc_property_t *pProperty = class_copyPropertyList([UIDatePicker class], &outCount);for (i = outCount -1; i >= 0; i--){// 循環獲取屬性的名字 property_getName函數返回一個屬性的名稱NSString *getPropertyName = [NSString stringWithCString:property_getName(pProperty[i]) encoding:NSUTF8StringEncoding];NSString *getPropertyNameString = [NSString stringWithCString:property_getAttributes(pProperty[i]) encoding:NSUTF8StringEncoding];if([getPropertyName isEqualToString:@"textColor"]){[picker setValue:[UIColor whiteColor] forKey:@"textColor"];}NSLog(@"%@====%@",getPropertyNameString,getPropertyName);}

    以上代碼中pProperty返回的是一個所有屬性的數組,通過循環遍歷我發現@”textColor”這個屬性應該就是我想要的屬性,然后通過setValue賦值白色,最后就做到了上圖的結果。

    或許說干過兩年ios開發的都知道這個東西,但是筆者更想表達的還是這種分析問題和處理問題并最終解決問題的思想,當我們修改系統原生控件遇到瓶頸的時候可以采用這種方法來學習這個控件更多的特性

    如果你覺得不過癮?那就繼續吧,更刺激的還在后面呢~

    • 本來這個地方做好之后,結果測試測出一個非常奇葩的bug,就是UIDatepicker在當天的字體仍然是黑色。
      -如下圖

      看到了么,因為我在寫這篇文章的時候是九月一號,所以九月一號的字體還是以前的黑色,比如說我動態改變系統日期為九月二號,它也會自動變成九月二號的字體是黑色,由于UI設計的是背景黑色,所以這里根本就看不清,嚴重影響產品體驗。

    • 通過一系列的糾結,我最后發現,如果UIDatepicker設置了最大時間(maxDate)和最小時間(minDate)就會這樣,如果不設置就不出現這種情況,但是需求要限制最大時間和最小時間。
      在這個解決的過程中,我試過了遍歷屬性還有查看官方API都找不到任何資料,甚至都想不通蘋果內部是怎么處理的這么牛逼的。
      實在沒辦法,我到處百度還是沒進展,最后我終于在國外的網站找老外解決了這個問題(老外為啥比國人要牛逼呢?)
      解決這個問題的核心代碼如下:

    SEL selector = NSSelectorFromString(@"setHighlightsToday:");NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDatePicker instanceMethodSignatureForSelector:selector]];BOOL no = NO;[invocation setSelector:selector];[invocation setArgument:&no atIndex:2];[invocation invokeWithTarget:picker];

    通過這個代碼我不斷的逆向推理其實現原理,并且各種百度查找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的字体颜色的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 添女人荫蒂视频 | 精品一区在线看 | 久久手机免费视频 | 欧美一a一片一级一片 | 日韩大片在线 | 91精品国产成人 | 阿v视频在线免费观看 | 美女搞黄视频网站 | 久久一区二 | av观看在线免费 | a在线天堂| 操操操干干干 | 可以免费在线观看的av | 深夜成人福利视频 | 日韩一区二区三免费高清在线观看 | 欧美精品日韩在线观看 | 日韩精品999| 亚洲精品乱码久久久久久黑人 | 麻豆影视国产在线观看 | xxx综合网| 日本一区二区三区四区五区 | 黑人玩弄人妻一区二区三区 | 久久久91视频 | 亚洲欧美一区在线 | 超碰99在线 | 亚洲AV无码成人精品区先锋 | 最近中文字幕第一页 | 制服诱惑一区 | 亚洲福利精品视频 | 91av影院| 激情图片区 | 黄频在线观看 | 无码精品黑人一区二区三区 | 伊人55| 成年人午夜视频 | 蜜桃av一区| 久久久不卡国产精品一区二区 | 少妇人妻偷人精品视频蜜桃 | 伦理片久久 | 国产成人精品久久 | 污视频网站免费观看 | www成年人 | 自拍天堂 | 久一视频在线 | 337p粉嫩大胆色噜噜噜 | 激情啪啪网站 | 日本在线www | 午夜一级黄色片 | 一个人看的www日本高清视频 | av网站网址 | 日本福利片在线观看 | 国产图片一区 | 九久久| 无码人妻久久一区二区三区 | 象人高潮调教丨vk | 上原亚衣av一区二区三区 | 最近免费中文字幕大全免费版视频 | 国产成人精品一区二区三区免费 | 久久久久久成人精品 | 亚洲欧美日韩精品永久在线 | 我看黄色一级片 | 亚洲伊人婷婷 | 日韩视频在线观看一区 | 国产精品久久av无码一区二区 | 久久国产中文字幕 | 伊人影院在线播放 | 国语对白做受欧美 | 日韩欧美123 | 亚欧美精品 | 一级片特黄 | 成人激情电影在线观看 | 天天爽夜夜操 | 宅男视频在线免费观看 | 夜夜草天天草 | 超碰2| 欧美天堂在线观看 | 欧美碰碰碰 | 欧美久久99 | 美利坚合众国av | 日日夜夜精品免费视频 | 91av在线看| 老司机深夜福利网站 | 91资源在线播放 | 国产视频在线播放 | 午夜香蕉网| 俄罗斯毛片 | 夜夜操综合 | 亚洲逼 | 成熟妇人a片免费看网站 | 影音先锋黑人 | 亚洲视频免费看 | 看a网站 | 国产精品99精品 | 国产传媒欧美日韩 | 亚洲天堂网一区 | 精品一区二区三区免费毛片爱 | 日韩免费高清一区二区 | 亚洲综合精品国产一区二区三区 | 在线观看麻豆 |