web-dev-qa-db-ja.com

UIDatePickerフォントの色を変更しますか?

UIDatePickerのフォントの色を変更するだけです。私は他の質問を調査しましたが、それらはすべて他のプロパティの変更と外観全体のカスタマイズを伴います。私がしたいのは、フォントの色を黒から白に変更することだけです。私はそのような一見単​​純な仕事をすることができないと信じることは難しいと思います。そして、なぜ色合いはそれに影響しないのですか?それは何もしませんか?

33
Milo

(iOS 8.xおよび9.0で)必要なのは、フォントの色を変更するための次の1行だけです。

        [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

}
69
waffles

Swift 2.1:

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

「今日」の代わりに現在の日が表示され、

22
DCDC

次の解決策は「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];

@ Jeremiah answer に代わるもう1つの方法は、Interface Builderでこれらの値を定義することです。 ViewControllerにコードを追加する必要がないため、これをお勧めします。

DatePickerビューをクリックして、スクリーンショットのように属性インスペクターからカスタマイズします。 screenshot

Swift 2、3、4、およびおそらくSwift <2.(テストなし)

14
Toldy

による - Apple's UIKit User Interface Catalog 、開発者は日付ピッカーをカスタマイズできません。

IPickerViewを使用して偽のUIDatePickerを作成し、それをカスタマイズすることを推奨 という同様の質問に対する他のStackOverflowの回答を見ました。

GitHub(https://github.com/mwermuth/MWDatePicker)でオープンソースの日付ピッカーも見つけました これは少し役立つかもしれません。さまざまな背景スタイルとセレクタスタイルを使用できますが、異なるフォントやフォント属性は使用できません。

7

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
Daniel Sumara

誰かがSwiftソリューションを望んでいる場合、viewDidLoadに以下を配置しました。

    birthdayDatePicker.setValue(DesignHelper.getOffWhiteColor(), forKey: "textColor")
    birthdayDatePicker.performSelector("setHighlightsToday:", withObject:DesignHelper.getOffWhiteColor())
4
Jeremiah
[date_picker setValue:textColor forKey:@"textColor"];
[date_picker performSelector:@selector(setHighlightsToday:) withObject:NO];
2
Srj0x0

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

Xamarin開発者向け:

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

それは魅力のように働いています。 iOS 9および10でテスト済み

2
xleon

KVC、スウィズリング、またはその他のプライベートAPIを使用せずに、UIAppearanceを使用して驚くほどきれいなソリューションを見つけました。 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;
2
gyratory circus

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
2
datinc

@Jeremiah answerの代わりに、これを使用できます:

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に適した回答

1
Dima Deplov

次の図に示すように、ストーリーボードから「textColor」という名前のランタイム属性を追加します。

enter image description here

1
Mehul Thakkar