iOS 更改UIDatePicker 的显示文字颜色

一、通过运用runtime 查找uidatepicker的所调用的方法

小编工作时候遇到了要更改UIDatePicker 文字的需求,当时我就懵了,因为datepicker系统默认的文字颜色为黑色,而我的需求是将其文字颜色,改为白色,极为麻烦的是datepicker 没有直接的属性对其进行修改。因此我想到了runtime的运用,通过利用runtime,将datepicker 所调用的方法全部找出,最后发现了@“textcolor”这一方法 代码如下:

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

    }

 通过底层C语言的方法,对@“textcolor”进行附值

二、通过NSInvocation 来改变选中字体的状态

当这一步完成时 你会发现datepicker  所选中的字体 依然是默认的黑色,而其他的地方已经变成了白色。(前提是你设置了最大值,或者设置了最小值,如果不设置应该是没有问题的)那么现在就需要用到NSInvocation(NSInvocation也是runtime中的一种方法)来进行队选中状态的附值,代码如下:

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 则程序运行 会报错

三、如果你看到这里,只能说明你还没有达成目的,那到底是哪里出了问题呢?

 如果还没有成功,那你一定是将前两补的代码放在了有关datepicker代码的后面,上面说了如果设置了最大值或者最小值,则系统直接默认为黑色,应在设置最大值,跟最小值之前编写以上两部分代码。

最好是在生成datepicker后直接编写以上两部分代码,那么就应该成功了



转载于:https://my.oschina.net/u/2561968/blog/550008

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值