日韩性视频-久久久蜜桃-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的字体颜色的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 超碰按摩| 国产精品自慰网站 | 久久视频免费在线观看 | www国产亚洲精品 | 一级片在线免费看 | 最近中文字幕免费视频 | 黑丝啪啪 | 日本大奶少妇 | 亚洲网站在线免费观看 | 欧美性狂猛xxxxxbbbbb | a久久久久久 | 色成人免费网站 | 亚洲精品9999 | 农村少妇久久久久久久 | 亚洲精品久久久中文字幕痴女 | 免费a级片在线观看 | 男人天堂成人网 | 华人在线视频 | 午夜a级片 | 在线免费色 | 久草免费在线视频 | 日韩毛片av| 性久久久久久久久久 | 九色porny自拍视频在线播放 | 在线免费观看a视频 | 一级片在线免费观看 | 丁香色综合 | 一卡二卡三卡四卡五卡 | 国产无码精品久久久 | yy6080午夜 | 好姑娘在线观看高清完整版电影 | 精品少妇人妻一区二区黑料社区 | 贝利弗山的秘密1985版免费观看 | 国产91成人 | 国产又黄又大又粗视频 | 猛1被调教成公厕尿便失禁网站 | 国产区精品在线观看 | 国产综合久久久久久鬼色 | 法国伦理少妇愉情 | 国产精品视频免费网站 | 天天操精品 | 一区二区三区四区五区在线视频 | 青青草视频在线免费观看 | av色区 | 国产56页 | 亚洲色图欧美另类 | 日本熟妇毛耸耸xxxxxx | 玖草视频在线 | 国产乱大交 | 欧亚av | 人人射人人插 | 丰满少妇高潮久久三区 | 亚洲自啪| 午夜欧美在线 | 日韩精品在线观看网站 | 日韩欧美一二三四区 | 国产69精品久久久久久久 | 久久久成人av | 日韩理论视频 | 91在线综合 | 日本一二三区在线 | 国产喷水视频 | 中文字幕1区2区 | 精品一区二区三区免费毛片 | 国产美女裸体无遮挡免费视频 | 成人午夜视频免费在线观看 | 黄色日批 | 成人久久久精品国产乱码一区二区 | 五月婷婷在线观看 | 中文字幕在线观看不卡 | 在线观看视频国产 | av中文在线播放 | 136福利视频导航 | 亚洲精品乱码久久久久久国产主播 | 中文字幕――色哟哟 | 原创少妇半推半就88av | 国产欧美一区二区三区沐欲 | 毛片毛片| 欧美另类极品videosbest最新版本 | 亚洲草逼视频 | 亚洲成av人片在www色猫咪 | av我不卡| 国产精品99久久久久久一二区 | 国产黄色网页 | 精品久久久久一区二区 | 91av影院| 亚洲精品短视频 | 超碰毛片 | 欧美日b片 | 国产男女无套 | 国产一级淫片免费 | 成人做受视频试看60秒 | 天天久久久 | 欧美三级免费 | 亚洲成年人网站在线观看 | jizz日本在线 | 一直草| julia一区二区中文久久97 | 377人体粉嫩噜噜噜 www.av黄色 |