iOS 更改UIDatePicker 的顯示文字顏色

1、經過運用runtime 查找uidatepicker的所調用的方法php

小編工做時候遇到了要更改UIDatePicker 文字的需求,當時我就懵了,由於datepicker系統默認的文字顏色爲黑色,而個人需求是將其文字顏色,改成白色,極爲麻煩的是datepicker 沒有直接的屬性對其進行修改。所以我想到了runtime的運用,經過利用runtime,將datepicker 所調用的方法所有找出,最後發現了@「textcolor」這一方法 代碼以下:
html

unsigned  int outCount;
    int i;
    objc_property_t *pProperty = class_copyPropertyList([UIDatePicker class], &outCount);
    for (i = outCount -1; i >= 0; i--)
    {
app

        // 循環獲取屬性的名字   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);
ui

    }url

 經過底層C語言的方法,對@「textcolor」進行附值es5

2、經過NSInvocation 來改變選中字體的狀態spa

當這一步完成時 你會發現datepicker  所選中的字體 依然是默認的黑色,而其餘的地方已經變成了白色。(前提是你設置了最大值,或者設置了最小值,若是不設置應該是沒有問題的)那麼如今就須要用到NSInvocation(NSInvocation也是runtime中的一種方法)來進行隊選中狀態的附值,代碼以下:
code

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];


如下爲每一步代碼的應用:

  1. SEL selector =NSSelectorFromString(@」setHighlightsToday:」); 
    經過Runtime的NSSelectorFromString利用字符串獲取方法@」setHighlightsToday:」(注意,看這個方法名就是今天的高亮顯示開關,注意字符串後面的冒號,表示這個方法是有參數的)

  2. NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDatePicker instanceMethodSignatureForSelector:selector]]; 
    用這個SEL建立UIdatepicker類的NSMethodSignature來建立一個NSInvocation。

  3. 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,也就是這個方法的第一個參數 能夠確定的是這個 2  是一個定數 若是爲1 則程序運行 會報錯

3、若是你看到這裏,只能說明你尚未達成目的,那究竟是哪裏出了問題呢?

 若是尚未成功,那你必定是將前兩補的代碼放在了有關datepicker代碼的後面,上面說了若是設置了最大值或者最小值,則系統直接默認爲黑色,應在設置最大值,跟最小值以前編寫以上兩部分代碼。

最好是在生成datepicker後直接編寫以上兩部分代碼,那麼就應該成功了

相關文章
相關標籤/搜索