Изменить цвет шрифта UIDatePicker?

Все, что я хочу сделать, это изменить цвет шрифта UIDatePicker. Я исследовал другие вопросы, но все они связаны с изменением других свойств и настройкой всего внешнего вида. Все, что я хочу сделать, это просто изменить цвет шрифта с черного на белый. Мне трудно поверить, что я не могу сделать такую, казалось бы, простую задачу. И почему цвет оттенка не повлияет на него? Это даже что-то делает?

Ответ 1

Все, что мне нужно (на 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

}

Ответ 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)

Вместо "сегодня" вы увидите текущий день,

Ответ 3

Следующее решение происходит от "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];

Ответ 4

Другой альтернативой @Jeremiah answer является определение этих значений в Interface Builder. Я предпочитаю это, потому что в вашем ViewController нет кода для добавления.

Нажмите на свое представление DatePicker и настройте его из инспектора атрибутов, как на скриншоте. screenshot

Работает для Swift 2, 3, 4 и, вероятно, для Swift < 2. (не проверено)

Ответ 5

Согласно Apple UIKit User Interface Catalog, разработчикам не разрешается настраивать средства Apple UIKit User Interface Catalog даты.

Я видел другие ответы StackOverflow на похожие вопросы, в которых предлагается создать поддельный UIDatePicker с использованием UIPickerView и настроить его.

Я также нашел средство выбора даты с открытым исходным кодом на GitHub (по адресу https://github.com/mwermuth/MWDatePicker), которое может немного помочь. Он допускает разные стили фона и селектора, но не другой шрифт или атрибуты шрифта.... пока.

Ответ 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.

Ответ 7

Если кто-то хочет быстрое решение, я поместил в viewDidLoad следующее:

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

Ответ 8

Этот подкласс 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

Ответ 9

Вы также можете добавить это как IBDesignable, если вы хотите настроить его в InterFace Builder.

    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. 
        }
    }
}

Ответ 10

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

Ответ 11

Для разработчиков Xamarin:

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

Он работает как шарм. Протестировано в iOS 9 и 10

Ответ 12

Я наткнулся на удивительно чистое решение, используя UIAppearance, не используя никакой KVC, swizzling или иначе частный API. Я обнаружил, что попытка установить textColor через UIAppearance для любого UILabel внутри UIDatePicker не повлияла, но свойство пользовательского внешнего вида, которое просто называется регулярным установщиком 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;

Ответ 13

В качестве альтернативы ответу @Jeremiah вы можете использовать это:

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

он удалит Today (вы увидите текущую дату), но он будет с правильным цветом.

Возможные проблемы: если вы меняете цвет динамически, я не нашел способ перезагрузки выбора даты. Таким образом, пользователь увидит предыдущий цвет и только после прокрутки цвет изменится на новый. → Решено, последней строкой. Похож на Voodoo, но он работает...

Этот ответ подходит для Swift 2.1

Ответ 14

Добавьте атрибут Runtime с именем "textColor" из Storyboard, как показано на следующем рисунке.

введите описание изображения здесь