更改UIDatePicker字体颜色?

时间:2014-01-02 01:21:08

标签: ios objective-c fonts colors uidatepicker

我想要做的就是更改UIDatePicker的字体颜色。我研究了其他问题,但他们都涉及改变其他属性和定制整个外观。我想要做的只是将字体颜色从黑色更改为白色。我发现很难相信我不能做这么看似简单的任务。为什么淡色会影响它呢?它甚至做了什么吗?

16 个答案:

答案 0 :(得分:68)

所有我需要的(在iOS 8.x和9.0上)是这一行来改变字体颜色:

        [my_date_picker setValue:[UIColor whiteColor] forKey:@"textColor"];

没有子类化或调用私有API ......

注意:今天的当前日期仍会突出显示(在较新的iOS版本中)。您可以使用以下代码解决此问题:

if ([my_date_picker respondsToSelector:sel_registerName("setHighlightsToday:")]) {

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"

        [my_date_picker performSelector:@selector(setHighlightsToday:) withObject:[NSNumber numberWithBool:NO]];

#pragma clang diagnostic pop

}

答案 1 :(得分:22)

从Swift 2.1开始:

picker.setValue(UIColor.whiteColor(), forKey: "textColor")
picker.sendAction("setHighlightsToday:", to: nil, forEvent: nil)
let date = NSDate()
picker.setDate(date, animated: false)

而不是“今天”你会看到当天,

答案 2 :(得分:18)

下一个解决方案来自" arturgrigor"它在我的应用程序中运行良好,只需复制它,将其粘贴到viewDidLoad方法中,然后享受它:

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

答案 3 :(得分:14)

@Jeremiah answer的另一种替代方法是在Interface Builder中定义这些值。 我更喜欢这个,因为在ViewController中没有要添加的代码。

单击您的DatePicker视图并从属性检查器中自定义它,如屏幕截图所示。 screenshot

适用于Swift 2,3,4,可能适用于Swift< 2.(未经测试)

答案 4 :(得分:7)

根据Apple's UIKit User Interface Catalog,开发者不得自定义日期选择器。

我已经看到了suggest making a fake UIDatePicker using UIPickerView and customizing that

类似问题的其他StackOverflow答案

I also found an open source date picker on GitHub (at https://github.com/mwermuth/MWDatePicker )可能会有所帮助。它允许不同的背景和选择器样式,但不允许使用不同的字体或字体属性....

答案 5 :(得分:6)

要更改UIDatePicker文字颜色,请使用:

    // MARK: - Helping content 

    private enum DatePickerProperties: String {
        case TextColor = "textColor"
        case HighlightsToday = "highlightsToday"
    }

    // MARK: - Outlets

    @IBOutlet private weak var datePicker: UIDatePicker!

    // MARK: - Lifecicle

    public override func awakeFromNib() {
        super.awakeFromNib()

        self.datePicker.setValue(UIColor.whiteColor(), forKey: DatePickerProperties.TextColor.rawValue)
        self.datePicker.setValue(false, forKey: DatePickerProperties.HighlightsToday.rawValue)
    }

它就像xCode 7.3和Swift 2.3的魅力一样。

答案 6 :(得分:4)

如果有人想要快速解决方案,我将以下内容放在viewDidLoad中:

    birthdayDatePicker.setValue(DesignHelper.getOffWhiteColor(), forKey: "textColor")
    birthdayDatePicker.performSelector("setHighlightsToday:", withObject:DesignHelper.getOffWhiteColor())

答案 7 :(得分:2)

这个UIDatePicker的子类适用于iOS 7.它不是很漂亮,但可以完成工作。

#define kNotification_UIView_didAddSubview @"kNotification_UIView_didAddSubview"
@implementation UIView (addSubview)

-(void) didAddSubview:(UIView *)subview{
    [[NSNotificationCenter defaultCenter] postNotificationName:kNotification_UIView_didAddSubview object:self];
}
@end


@interface DatePicker ()
@property (nonatomic, strong) UIColor* textColor;
@end

@implementation DatePicker

-(id) initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self){
        [self setup];
    }
    return self;
}
-(id) initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if (self){
        [self setup];
    }
    return self;
}

-(void) setup{
    self.textColor = [UIColor darkTextColor];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(subviewsUpdated:) name:kNotification_UIView_didAddSubview object:nil];
}

-(void) dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

-(void) updateLabels:(UIView*) view{
    for (UILabel* label in view.subviews){
        if ([label isKindOfClass:[UILabel class]]){
            label.textColor = self.textColor;
        }else{
            [self updateLabels:label];
        }
    }
}

-(BOOL) isSubview:(UIView*) view{
    if (view == nil){
        return NO;
    }
    if (view.superview == self){
        return YES;
    }
    return [self isSubview:view.superview];
}

-(void) subviewsUpdated:(NSNotification*) notification{
    if ([notification.object isKindOfClass:NSClassFromString(@"UIPickerTableView")] && [self isSubview:notification.object]){
        [self updateLabels:notification.object];
    }
}

@end

答案 8 :(得分:2)

如果要在InterFace Builder中进行配置,也可以将其添加为IBDesignable。

    import UIKit

@IBDesignable
extension UIDatePicker {
    @IBInspectable var textLabelColor: UIColor? {
        get {
            return self.valueForKey("textColor") as? UIColor
        }
        set {
            self.setValue(newValue, forKey: "textColor")
            self.performSelector("setHighlightsToday:", withObject:newValue) //For some reason this line makes the highlighted text appear the same color but can not be changed from textColor. 
        }
    }
}

答案 9 :(得分:2)

[date_picker setValue:textColor forKey:@"textColor"];
[date_picker performSelector:@selector(setHighlightsToday:) withObject:NO];

答案 10 :(得分:2)

对于Xamarin开发人员:

DatePicker.SetValueForKey(UIColor.White, new NSString("textColor"));
DatePicker.SetValueForKey(FromObject(false), new NSString("highlightsToday"));

它的工作就像一个魅力。 在iOS 9和10中测试

答案 11 :(得分:2)

我使用UIAppearance偶然发现了一个令人惊讶的干净解决方案,没有使用任何KVC,混合或其他私有API。我发现,尝试为textColor内的任何UIAppearance设置UILabel UIDatePicker没有任何影响,但是自定义外观属性只调用常规textColor setter工作得很好。

// Implement a custom appearance property via a UILabel category
@interface UILabel (PickerLabelTextColor)

@property (nonatomic, strong) UIColor * textColorWorkaround UI_APPEARANCE_SELECTOR;

@end

@implementation UILabel (PickerLabelTextColor)

- (UIColor *)textColorWorkaround {
    return self.textColor;
}

- (void)setTextColorWorkaround:(UIColor *)textColor {
    self.textColor = textColor;
}

@end

然后使用如下:

UILabel *pickerLabelProxy = [UILabel appearanceWhenContainedInInstancesOfClasses:@[UIDatePicker.class]];
pickerLabelProxy.textColorWorkaround = UIColor.lightGrayColor;

答案 12 :(得分:1)

作为@Jeremiah回答的替代方案,您可以使用:

datePicker.setValue(UIColor.redColor(), forKey: "textColor")
datePicker.sendAction("setHighlightsToday:", to: nil, forEvent: nil)
datePicker.setDate(NSDate(timeIntervalSinceReferenceDate: 0), animated: false)

它将删除今天(您将看到当前日期),但它将是正确的颜色。

可能的麻烦: 如果你动态改变颜色,我没有找到重新加载日期选择器的方法。因此,用户将看到以前的颜色,并且仅在滚动之后,颜色将更改为新的颜色。 - >通过最后一个字符串解决。看起来像Voodoo,但它有效...

这个答案适合Swift 2.1

答案 13 :(得分:1)

添加名为" textColor"的运行时属性来自Storyboard,如下图所示。

enter image description here

答案 14 :(得分:0)

直到在layoutSubviews()中设置了textColor,该方法才起作用

override func layoutSubviews() {
    super.layoutSubviews()
    datePicker.backgroundColor = .black
    datePicker.setValue(.white, forKeyPath: "textColor")
}

答案 15 :(得分:0)

只需使用 datePicker.tintColor = .red 或您想要的任何其他颜色。