更改UIDatePicker字体颜色?

Mil*_*ilo 34 fonts colors objective-c uidatepicker ios

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

waf*_*les 75

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

        [my_date_picker setValue:[UIColor whiteColor] forKey:@"textColor"];
Run Code Online (Sandbox Code Playgroud)

没有子类或私有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

}
Run Code Online (Sandbox Code Playgroud)

  • 我试过了,但今天的日期部分是错误的颜色,10和10月是黑色的,我不介意一年的颜色错了,但另外2个感觉很奇怪 (7认同)
  • 对于当前日期`[my_date_picker performSelector:@selector(setHighlightsToday :) withObject:NO];` (4认同)
  • 除了当前日期(2015年8月2日,例如全部为黑色)之外,这会将所有文本更改为白色. (3认同)

DCD*_*CDC 23

从Swift 2.1开始:

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

而不是"今天",你会看到当天,

  • `setHighlightsToday`引发一个警告,'没有用Objective-C选择器声明的方法'setHighlightsToday:'` (2认同)
  • Swift 3: picker.setValue(UIColor.white, forKey: "textColor") picker.sendAction(Selector(("setHighlightsToday:")), to: nil, for: nil) (2认同)

Jos*_*uez 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];
Run Code Online (Sandbox Code Playgroud)


Tol*_*ldy 18

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

单击"DatePicker"视图,然后从"属性"检查器中对其进行自定义,如屏幕截图所示. 截图

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


Mic*_*ann 7

根据Apple的UIKit用户界面目录,开发人员不允许自定义日期选择器.

我已经看到其他类似问题的StackOverflow答案,建议使用UIPickerView制作假UIDatePicker并自定义它.

我还在GitHub上找到了一个开源日期选择器(在https://github.com/mwermuth/MWDatePicker上)可能会有所帮助.它允许不同的背景和选择器样式,但不是不同的字体或字体属性....


Dan*_*ara 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)
    }
Run Code Online (Sandbox Code Playgroud)

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


gyr*_*cus 6

我偶然发现了一个令人惊讶的干净解决方案,使用UIAppearance,而不使用任何 KVC、swizzling 或其他私有 API。我发现尝试为a 中的任何内容设置过textColor孔都没有影响,但是简单地调用常规设置器的自定义外观属性就可以正常工作。UIAppearanceUILabelUIDatePickertextColor

// 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
Run Code Online (Sandbox Code Playgroud)

然后使用如下:

UILabel *pickerLabelProxy = [UILabel appearanceWhenContainedInInstancesOfClasses:@[UIDatePicker.class]];
pickerLabelProxy.textColorWorkaround = UIColor.lightGrayColor;
Run Code Online (Sandbox Code Playgroud)

迅捷版

UI标签扩展:

extension UILabel {
    @objc dynamic var textColorWorkaround: UIColor? {
        get {
            return textColor
        }
        set {
            textColor = newValue
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

外观代理使用:

let pickerLabelProxy = UILabel.appearance(whenContainedInInstancesOf: [UIDatePicker.self])
pickerLabelProxy.textColorWorkaround = UIColor.lightGray
Run Code Online (Sandbox Code Playgroud)