我想要做的就是更改UIDatePicker的字体颜色。我研究了其他问题,但他们都涉及改变其他属性和定制整个外观。我想要做的只是将字体颜色从黑色更改为白色。我发现很难相信我不能做这么看似简单的任务。为什么淡色会影响它呢?它甚至做了什么吗?
答案 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视图并从属性检查器中自定义它,如屏幕截图所示。
适用于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)
答案 14 :(得分:0)
直到在layoutSubviews()中设置了textColor,该方法才起作用
override func layoutSubviews() {
super.layoutSubviews()
datePicker.backgroundColor = .black
datePicker.setValue(.white, forKeyPath: "textColor")
}
答案 15 :(得分:0)
只需使用 datePicker.tintColor = .red
或您想要的任何其他颜色。