Вопрос по ios, uidatepicker, fonts, colors, objective-c – Изменить цвет шрифта UIDatePicker?

30

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

возможный дубликатя могу изменить цвет шрифта datePicker в iOS7? HalR
В вопросе выше я нашел свое решение. MarMass

Ваш Ответ

14   ответов
14

@ Иеремия ответ определить эти значения в Интерфейсном Разработчике. Я предпочитаю этот, потому что нет кода для добавления в вашем ViewController.

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

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

2

но выполняет свою работу.

#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
1

цвет текста" из раскадровки, как показано на следующем изображении.

63

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

}
то же самое здесь с "Сегодня", по крайней мере. Dima Deplov
При этом весь текст будет изменен на белый, за исключением текущей даты (например, 2 августа 2015 г. будет черным). rizzes
На текущую дату[my_date_picker performSelector:@selector(setHighlightsToday:) withObject:NO]; Nik Kov
Просто и фантастично. Вы'ты миф !!! Tom Calmon
7

Яблоко's UIKit Каталог Пользовательского Интерфейсаразработчикам не разрешено настраивать средства выбора даты.

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

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

Я вижу тамстянуть запрос открыт для модернизации MWDatePicker для iOS 7. Было бы хорошо, если бы владелец слил его, но, по крайней мере, вы можете взять его и использовать. Michael Dautermann
Спасибо, Майкл. Я проверил MWDatePicker, но похоже, чтодля iOS 7 еще не обновлено. Это'Когда я запускаю пример проекта, это просто пустая строка выбора. Я'мы решили смоделировать UIDatePicker, настроив UIPicker. Спасибо за помощь. Это'До сих пор очень удивительно, что Apple не допускает настройку выбора даты. Интересно, почему это так? Milo
2

если вы хотите настроить это в 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. 
        }
    }
}
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];
как насчет изменения шрифта? androniennn
Большой!!! Волшебным образом это работает! Marcelo dos Santos
Вы должны быть осторожны с этим. это вызывает частный API Apple, и Apple может отклонить ваше приложение за это! Saren Inden
@SarenInden, мои приложения Acces-o и Acces-o School используют его, нене волнуйтесь! Jose Manuel Abarca Rodríguez
6

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

2

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

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

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

используя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;
22

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

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

setHighlightsToday вызывает предупреждение,No method declared with Objective-C selector 'setHighlightsToday:' Daniel Storm
Это работает отлично !!! davidrelgr
Swift 3: picker.setValue (UIColor.white, forKey: "цвет текста") picker.sendAction (Selector (("setHighlightsToday:»)), чтобы: ноль, для: ноль) david72
1

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

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

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

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

4

    birthdayDatePicker.setValue(DesignHelper.getOffWhiteColor(), forKey: "textColor")
    birthdayDatePicker.performSelector("setHighlightsToday:", withObject:DesignHelper.getOffWhiteColor())
отлично !, любое решение для Swift < 2? executeSelector isn 'т доступен в 1.2 Dima Deplov
Для подавления предупреждений проверьте это решениеstackoverflow.com/questions/194666/... Fraser
в любом случае, чтобы удалить предупреждение в xcode 7.3 - не объявлен метод с селектором Objective-C "setHighlightsToday: "? user2643679
У меня нетт нашел один. Я'Мы подтвердили, что это работает и все еще нужно. Если у кого-то есть способ сделать это без предупреждения, это было бы здорово! Jeremiah

Похожие вопросы