我想做的只是改变UIDatePicker的字体颜色。我研究了其他问题,但它们都涉及到更改其他属性和自定义整个外观。我只想把字体颜色从黑色改成白色。我觉得很难相信我不能完成这样一个看似简单的任务。为什么tint color不起作用呢?它甚至有用吗?
我想做的只是改变UIDatePicker的字体颜色。我研究了其他问题,但它们都涉及到更改其他属性和自定义整个外观。我只想把字体颜色从黑色改成白色。我觉得很难相信我不能完成这样一个看似简单的任务。为什么tint color不起作用呢?它甚至有用吗?
在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
}
[my_date_picker performSelector:@selector(setHighlightsToday:) withObject:NO];
的意思是取消日期选择器中今天日期的高亮显示。 - Nike Kov除了@Jeremiah的回答之外,还有另一种选择,就是在界面构建器(Interface Builder)中定义这些值。
我更喜欢使用这种方式,因为不需要在您的ViewController中添加任何代码。
点击进入您的DatePicker视图,并像屏幕截图中所示从属性检查器中自定义它。
适用于Swift 2、3、4和可能适用于Swift < 2。(未经测试)
截至Swift 2.1版本:
picker.setValue(UIColor.whiteColor(), forKey: "textColor")
picker.sendAction("setHighlightsToday:", to: nil, forEvent: nil)
let date = NSDate()
picker.setDate(date, animated: false)
您将看到当前日期而不是“今天”。
setHighlightsToday
causes a warning, No method declared with Objective-C selector 'setHighlightsToday:'
- Daniel Storm…Selector(("setHighlightsToday:"))…
需要删除 :
以变为 …Selector(("setHighlightsToday"))…
,否则会导致运行时崩溃。 - l --marc l下一个解决方案来自于“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];
苹果的UIKit用户界面目录
,开发人员不允许自定义日期选择器。我偶然发现了一种惊人的干净解决方案,使用UIAppearance
,而不使用任何KVC、swizzling或其他私有API。我发现尝试通过UIAppearance
设置UIDatePicker
中任何UILabel
的textColor
没有影响,但一个简单调用常规textColor
设置器的自定义外观属性完全可以。
// 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;
UILabel扩展:
extension UILabel {
@objc dynamic var textColorWorkaround: UIColor? {
get {
return textColor
}
set {
textColor = newValue
}
}
}
外观代理使用:
let pickerLabelProxy = UILabel.appearance(whenContainedInInstancesOf: [UIDatePicker.self])
pickerLabelProxy.textColorWorkaround = UIColor.lightGray
要更改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 上运行得非常好。
birthdayDatePicker.setValue(DesignHelper.getOffWhiteColor(), forKey: "textColor")
birthdayDatePicker.performSelector("setHighlightsToday:", withObject:DesignHelper.getOffWhiteColor())
对于Xamarin开发者:
DatePicker.SetValueForKey(UIColor.White, new NSString("textColor"));
DatePicker.SetValueForKey(FromObject(false), new NSString("highlightsToday"));
它的工作效果非常好。在iOS 9和10上进行了测试。
如果你想在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.
}
}
}