ios objective-c fonts colors uidatepicker

ios - ¿Cambiar el color de la fuente UIDatePicker?



objective-c fonts (14)

Todo lo que quiero hacer es cambiar el color de fuente del UIDatePicker. He investigado otras preguntas, pero todas implican cambiar otras propiedades y personalizar todo el aspecto. Todo lo que quiero hacer es cambiar el color de la fuente de negro a blanco. Me cuesta creer que no pueda hacer una tarea tan simple. ¿Y por qué el color del tinte no lo afectaría? ¿Incluso hace algo?


A partir de Swift 2.1:

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

En lugar de "hoy" verá el día actual,


Agregue el atributo de tiempo de ejecución llamado "textColor" del guión gráfico como se muestra en la siguiente imagen.


Como alternativa a la respuesta de @Jeremiah, puedes usar esto:

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

se eliminará Hoy (verá la fecha actual), pero será con el color correcto.

Posibles problemas: si cambia el color dinámicamente, no encontré la forma de recargar el selector de fechas. Entonces, el usuario verá el color anterior y solo después del desplazamiento, el color cambiará a uno nuevo. -> Resuelto, por ultima cadena. Parece que el vudú, pero funciona ...

Esta respuesta adecuada para Swift 2.1


De acuerdo con el Catálogo de Interfaz de Usuario UIKit de Apple , los desarrolladores no pueden personalizar los recolectores de fechas.

He visto otras respuestas de para preguntas similares que sugieren hacer un UIDatePicker falso con UIPickerView y personalizarlo .

También encontré un selector de fecha de código abierto en GitHub (en https://github.com/mwermuth/MWDatePicker) que podría ayudar un poco. Permite diferentes estilos de fondo y selector, pero no una fuente diferente o atributos de fuente ... todavía.


Esta subclase de UIDatePicker funciona para iOS 7. No es bonita pero hace el trabajo.

#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


La siguiente solución viene de "arturgrigor" y funciona muy bien en mis aplicaciones, solo cópiela, péguela en el método viewDidLoad y disfrútelo:

[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];


Me encontré con una solución sorprendentemente limpia que usa UIAppearance , sin usar ningún KVC, swizzling o cualquier otra API privada. Descubrí que el intento de establecer el textColor través de la textColor UIAppearance para cualquier UILabel dentro de un UIDatePicker no tenía ningún efecto, pero una propiedad de apariencia personalizada que simplemente llamaba al textColor normal funcionaba bien.

// 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

Y luego usar de la siguiente manera:

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


Otra alternativa a la respuesta de @Jeremiah es definir esos valores en Interface Builder. Prefiero este porque no hay código para agregar en su ViewController.

Haga clic en su vista DatePicker y personalícelo desde el inspector de atributos como en la captura de pantalla.

Funciona para Swift 2, 3, 4 y probablemente para Swift <2. (no probado)


Para cambiar el color del texto de UIDatePicker use:

// 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) }

Funciona como un encanto con xCode 7.3 y Swift 2.3.


Para los desarrolladores de Xamarin:

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

Está funcionando a la perfección. Probado en iOS 9 y 10


Si alguien quiere la solución rápida, coloqué lo siguiente en viewDidLoad:

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


También puede agregar esto como un IBDesignable si desea configurarlo dentro de 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. } } }


Todo lo que necesito (en iOS 8.xy 9.0) es esta única línea para cambiar el color de la fuente:

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

Sin subclasificación o invocación de API privadas ...

Nota: la fecha actual de hoy aún estará resaltada (en las versiones más recientes de iOS) Puedes solucionar esto usando el siguiente código:

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 }


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