我可以在iOS7中更改datePicker的字体颜色吗?
只是下载了我的Xcode 5的副本,并想知道如果有人知道我可以如何更改dateselect器中的字体的颜色或大小?
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{ UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, pickerView.frame.size.width, 44)]; label.backgroundColor = [UIColor grayColor]; label.textColor = [UIColor whiteColor]; label.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:18]; label.text = [NSString stringWithFormat:@" %d", row+1]; return label; } // number Of Components - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ return 1; } // number Of Rows In Component - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component{ return 6; }
我需要类似于我的应用程序,并最终走了很长的路。 真正的耻辱是没有简单的方法来简单地切换到UIDatePicker的白色文本版本。
下面的代码使用UILabel上的类别来强制标签的文本颜色在setTextColor:消息发送到标签时变成白色。 为了不对应用程序中的每个标签都做到这一点,我已经过滤了它只适用于它是UIDatePicker类的子视图。 最后,一些标签在添加到他们的超级视图之前已经设置了它们的颜色。 要捕获这些代码,将覆盖willMoveToSuperview:方法。
将下面的内容分成多个类别可能会更好,但为了方便发布,我在这里添加了所有内容。
#import "UILabel+WhiteUIDatePickerLabels.h" #import <objc/runtime.h> @implementation UILabel (WhiteUIDatePickerLabels) + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [self swizzleInstanceSelector:@selector(setTextColor:) withNewSelector:@selector(swizzledSetTextColor:)]; [self swizzleInstanceSelector:@selector(willMoveToSuperview:) withNewSelector:@selector(swizzledWillMoveToSuperview:)]; }); } // Forces the text colour of the label to be white only for UIDatePicker and its components -(void) swizzledSetTextColor:(UIColor *)textColor { if([self view:self hasSuperviewOfClass:[UIDatePicker class]] || [self view:self hasSuperviewOfClass:NSClassFromString(@"UIDatePickerWeekMonthDayView")] || [self view:self hasSuperviewOfClass:NSClassFromString(@"UIDatePickerContentView")]){ [self swizzledSetTextColor:[UIColor whiteColor]]; } else { //Carry on with the default [self swizzledSetTextColor:textColor]; } } // Some of the UILabels haven't been added to a superview yet so listen for when they do. - (void) swizzledWillMoveToSuperview:(UIView *)newSuperview { [self swizzledSetTextColor:self.textColor]; [self swizzledWillMoveToSuperview:newSuperview]; } // -- helpers -- - (BOOL) view:(UIView *) view hasSuperviewOfClass:(Class) class { if(view.superview){ if ([view.superview isKindOfClass:class]){ return true; } return [self view:view.superview hasSuperviewOfClass:class]; } return false; } + (void) swizzleInstanceSelector:(SEL)originalSelector withNewSelector:(SEL)newSelector { Method originalMethod = class_getInstanceMethod(self, originalSelector); Method newMethod = class_getInstanceMethod(self, newSelector); BOOL methodAdded = class_addMethod([self class], originalSelector, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)); if (methodAdded) { class_replaceMethod([self class], newSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, newMethod); } } @end
这是最简单的方法,它的工作原理! 我承诺。 在视图中创buildUIDatePicker,或通过故事板连接它,然后将以下代码放入ViewDidLoad方法中。 将第一行中的“datepicker”replace为您的dateselect器。
Objective-C的:
//Set Color of Date Picker self.datePicker.datePickerMode = UIDatePickerModeDate; [self.datePicker setValue:[UIColor colorWithRed:70/255.0f green:161/255.0f blue:174/255.0f alpha:1.0f] 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:self.datePicker];
“你不能自定义dateselect器的外观”。
请参阅iOS 7devise资源/ UIKit用户界面目录/date选取器
我继续使用iOS 7的UIControl
和UIPicker
实现了UIDatePicker
replace。这使您可以编辑所需的所有内容,包括文本字体和颜色。 唯一不能改变的是所选行周围的线的颜色。
有些东西可以进一步简化,它只显示date,而不是时间。 这可以作为任何人想要做类似的事情的起点。
@interface SBDatePicker : UIControl @property (nonatomic, strong, readwrite) NSDate *minimumDate; @property (nonatomic, strong, readwrite) NSDate *maximumDate; @property (nonatomic, strong, readwrite) NSDate *date; - (void)setDate:(NSDate *)date animated:(BOOL)animated; @end
#import "SBDatePicker.h" const NSUInteger NUM_COMPONENTS = 3; typedef enum { kSBDatePickerInvalid = 0, kSBDatePickerYear, kSBDatePickerMonth, kSBDatePickerDay } SBDatePickerComponent; @interface SBDatePicker () <UIPickerViewDataSource, UIPickerViewDelegate> { SBDatePickerComponent _components[NUM_COMPONENTS]; } @property (nonatomic, strong, readwrite) NSCalendar *calendar; @property (nonatomic, weak, readwrite) UIPickerView *picker; @property (nonatomic, strong, readwrite) NSDateFormatter *dateFormatter; @property (nonatomic, strong, readwrite) NSDateComponents *currentDateComponents; @property (nonatomic, strong, readwrite) UIFont *font; @end @implementation SBDatePicker #pragma mark - Life cycle - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (!self) { return nil; } [self commonInit]; return self; } - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (!self) { return nil; } [self commonInit]; return self; } - (void)commonInit { self.tintColor = [UIColor whiteColor]; self.font = [UIFont systemFontOfSize:23.0f]; self.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; [self setLocale:[NSLocale currentLocale]]; UIPickerView *picker = [[UIPickerView alloc] initWithFrame:self.bounds]; picker.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); picker.dataSource = self; picker.delegate = self; picker.tintColor = [UIColor whiteColor]; self.date = [NSDate date]; [self addSubview:picker]; self.picker = picker; } - (CGSize)intrinsicContentSize { return CGSizeMake(320.0f, 216.0f); } #pragma mark - Setup - (void)setMinimumDate:(NSDate *)minimumDate { _minimumDate = minimumDate; [self updateComponents]; } - (void)setMaximumDate:(NSDate *)maximumDate { _maximumDate = maximumDate; [self updateComponents]; } - (void)setDate:(NSDate *)date { [self setDate:date animated:NO]; } - (void)setDate:(NSDate *)date animated:(BOOL)animated { self.currentDateComponents = [self.calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date]; [self.picker reloadAllComponents]; [self setIndicesAnimated:YES]; } - (NSDate *)date { return [self.calendar dateFromComponents:self.currentDateComponents]; } - (void)setLocale:(NSLocale *)locale { self.calendar.locale = locale; [self updateComponents]; } - (SBDatePickerComponent)componentFromLetter:(NSString *)letter { if ([letter isEqualToString:@"y"]) { return kSBDatePickerYear; } else if ([letter isEqualToString:@"m"]) { return kSBDatePickerMonth; } else if ([letter isEqualToString:@"d"]) { return kSBDatePickerDay; } else { return kSBDatePickerInvalid; } } - (SBDatePickerComponent)thirdComponentFromFirstComponent:(SBDatePickerComponent)component1 andSecondComponent:(SBDatePickerComponent)component2 { NSMutableIndexSet *set = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(kSBDatePickerInvalid + 1, NUM_COMPONENTS)]; [set removeIndex:component1]; [set removeIndex:component2]; return (SBDatePickerComponent) [set firstIndex]; } - (void)updateComponents { NSString *componentsOrdering = [NSDateFormatter dateFormatFromTemplate:@"yMMMMd" options:0 locale:self.calendar.locale]; componentsOrdering = [componentsOrdering lowercaseString]; NSString *firstLetter = [componentsOrdering substringToIndex:1]; NSString *lastLetter = [componentsOrdering substringFromIndex:(componentsOrdering.length - 1)]; _components[0] = [self componentFromLetter:firstLetter]; _components[2] = [self componentFromLetter:lastLetter]; _components[1] = [self thirdComponentFromFirstComponent:_components[0] andSecondComponent:_components[2]]; self.dateFormatter = [[NSDateFormatter alloc] init]; self.dateFormatter.calendar = self.calendar; self.dateFormatter.locale = self.calendar.locale; [self.picker reloadAllComponents]; [self setIndicesAnimated:NO]; } - (void)setIndexForComponentIndex:(NSUInteger)componentIndex animated:(BOOL)animated { SBDatePickerComponent component = [self componentForIndex:componentIndex]; NSRange unitRange = [self rangeForComponent:component]; NSInteger value; if (component == kSBDatePickerYear) { value = self.currentDateComponents.year; } else if (component == kSBDatePickerMonth) { value = self.currentDateComponents.month; } else if (component == kSBDatePickerDay) { value = self.currentDateComponents.day; } else { assert(NO); } NSInteger index = (value - unitRange.location); NSInteger middleIndex = (INT16_MAX / 2) - (INT16_MAX / 2) % unitRange.length + index; [self.picker selectRow:middleIndex inComponent:componentIndex animated:animated]; } - (void)setIndicesAnimated:(BOOL)animated { for (NSUInteger componentIndex = 0; componentIndex < NUM_COMPONENTS; componentIndex++) { [self setIndexForComponentIndex:componentIndex animated:animated]; } } - (SBDatePickerComponent)componentForIndex:(NSInteger)componentIndex { return _components[componentIndex]; } - (NSCalendarUnit)unitForComponent:(SBDatePickerComponent)component { if (component == kSBDatePickerYear) { return NSYearCalendarUnit; } else if (component == kSBDatePickerMonth) { return NSMonthCalendarUnit; } else if (component == kSBDatePickerDay) { return NSDayCalendarUnit; } else { assert(NO); } } - (NSRange)rangeForComponent:(SBDatePickerComponent)component { NSCalendarUnit unit = [self unitForComponent:component]; return [self.calendar maximumRangeOfUnit:unit]; } #pragma mark - Data source - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 3; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)componentIndex { return INT16_MAX; } #pragma mark - Delegate - (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)componentIndex { SBDatePickerComponent component = [self componentForIndex:componentIndex]; if (component == kSBDatePickerYear) { CGSize size = [@"0000" sizeWithAttributes:@{NSFontAttributeName : self.font}]; return size.width + 25.0f; } else if (component == kSBDatePickerMonth) { CGFloat maxWidth = 0.0f; for (NSString *monthName in self.dateFormatter.monthSymbols) { CGFloat monthWidth = [monthName sizeWithAttributes:@{NSFontAttributeName : self.font}].width; maxWidth = MAX(monthWidth, maxWidth); } return maxWidth + 25.0f; } else if (component == kSBDatePickerDay) { CGSize size = [@"00" sizeWithAttributes:@{NSFontAttributeName : self.font}]; return size.width + 25.0f; } else { return 0.01f; } } - (NSString *)titleForRow:(NSInteger)row forComponent:(SBDatePickerComponent)component { NSRange unitRange = [self rangeForComponent:component]; NSInteger value = unitRange.location + (row % unitRange.length); if (component == kSBDatePickerYear) { return [NSString stringWithFormat:@"%li", (long) value]; } else if (component == kSBDatePickerMonth) { return [self.dateFormatter.monthSymbols objectAtIndex:(value - 1)]; } else if (component == kSBDatePickerDay) { return [NSString stringWithFormat:@"%li", (long) value]; } else { return @""; } } - (NSInteger)valueForRow:(NSInteger)row andComponent:(SBDatePickerComponent)component { NSRange unitRange = [self rangeForComponent:component]; return (row % unitRange.length) + unitRange.location; } - (BOOL)isEnabledRow:(NSInteger)row forComponent:(NSInteger)componentIndex { NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; dateComponents.year = self.currentDateComponents.year; dateComponents.month = self.currentDateComponents.month; dateComponents.day = self.currentDateComponents.day; SBDatePickerComponent component = [self componentForIndex:componentIndex]; NSInteger value = [self valueForRow:row andComponent:component]; if (component == kSBDatePickerYear) { dateComponents.year = value; } else if (component == kSBDatePickerMonth) { dateComponents.month = value; } else if (component == kSBDatePickerDay) { dateComponents.day = value; } NSDate *rowDate = [self.calendar dateFromComponents:dateComponents]; if (self.minimumDate != nil && [self.minimumDate compare:rowDate] == NSOrderedDescending) { return NO; } else if (self.maximumDate != nil && [rowDate compare:self.maximumDate] == NSOrderedDescending) { return NO; } return YES; } - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)componentIndex reusingView:(UIView *)view { UILabel *label; if ([view isKindOfClass:[UILabel class]]) { label = (UILabel *) view; } else { label = [[UILabel alloc] init]; label.font = self.font; } SBDatePickerComponent component = [self componentForIndex:componentIndex]; NSString *title = [self titleForRow:row forComponent:component]; UIColor *color; BOOL enabled = [self isEnabledRow:row forComponent:componentIndex]; if (enabled) { color = [UIColor whiteColor]; } else { color = [UIColor colorWithWhite:0.0f alpha:0.5f]; } NSAttributedString *attributedTitle = [[NSAttributedString alloc] initWithString:title attributes:@{NSForegroundColorAttributeName: color}]; label.attributedText = attributedTitle; if (component == kSBDatePickerMonth) { label.textAlignment = NSTextAlignmentLeft; } else { label.textAlignment = NSTextAlignmentRight; } return label; } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)componentIndex { SBDatePickerComponent component = [self componentForIndex:componentIndex]; NSInteger value = [self valueForRow:row andComponent:component]; if (component == kSBDatePickerYear) { self.currentDateComponents.year = value; } else if (component == kSBDatePickerMonth) { self.currentDateComponents.month = value; } else if (component == kSBDatePickerDay) { self.currentDateComponents.day = value; } else { assert(NO); } [self setIndexForComponentIndex:componentIndex animated:NO]; NSDate *datePicked = self.date; if (self.minimumDate != nil && [datePicked compare:self.minimumDate] == NSOrderedAscending) { [self setDate:self.minimumDate animated:YES]; } else if (self.maximumDate != nil && [datePicked compare:self.maximumDate] == NSOrderedDescending) { [self setDate:self.maximumDate animated:YES]; } else { [self.picker reloadAllComponents]; } [self sendActionsForControlEvents:UIControlEventValueChanged]; } @end
我也在努力,在黑色背景上的黑色文字。 :)我还没有find一种方法来改变文字的颜色呢。 然而,你可以玩背景颜色:
picker.backgroundColor = [UIColor whiteColor];
另一个黑客我发现,工作是给每个UIView在dateselect器(每个数字有它自己的UIView,(是的,我知道)
[UIView appearanceWhenContainedIn:[UITableView class], [UIDatePicker class], nil].backgroundColor = [UIColor colorWithWhite:1 alpha:0.5]
(我不推荐使用这个选项,因为它在旋转时会引起恼人的闪烁效果。)
希望这可以帮助。 🙂
在viewDidLoad中,
datePicker.setValue(UIColor.yellowColor(), forKey: "textColor") datePicker.performSelector("setHighlightsToday:", withObject:UIColor.yellowColor())
适用于iOS 9
有点不好意思,但是再一次,其他的解决scheme也是如此。 这工作对我来说:UIDatePicker的子类,并在添加任何视图之前更改textColor属性的值。
要改变颜色:
class ColoredDatePicker: UIDatePicker { var changed = false override func addSubview(view: UIView) { if !changed { changed = true self.setValue(yourColor, forKey: "textColor") } super.addSubview(view) } }
要更改颜色和其他属性:
我会更新,如果我找出这一个。
我注意到,颜色不是完全按照颜色对象的指示来表示的,而是使用它来获得它的颜色。
我在这里回答了一个类似的问题: UIPickerView自定义字体iOS7基本上你必须破解viewForRow:方法,现在我只有它的工作UIPickerView的不UIDatePickers。 (在…上工作)
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
这里是你如何为UIPickerView显示属性文本(自定义字体,颜色等)
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { // create attributed string NSString *yourString; //can also use array[row] to get string NSDictionary *attributeDict = @{NSForegroundColorAttributeName : [UIColor whiteColor]}; NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:yourString attributes:attributeDict]; // add the string to a label's attributedText property UILabel *labelView = [[UILabel alloc] init]; labelView.attributedText = attributedString; // return the label return labelView;
}
希望有帮助…一旦我找出dateselect器,我会尽快编辑我的答案!
在swift中,你可以将这两行添加到你的viewDidLoad中:
datePicker.setValue(DesignHelper.getOffWhiteColor(), forKey: "textColor") datePicker.performSelector("setHighlightsToday:", withObject: UIColor.whiteColor())
这适用于iOS 9
[datePicker setValue:[UIColor whiteColor] forKey:@"textColor"];
试试这个: https : //github.com/attias/AADatePicker
对我来说工作得很好。
我偶然发现了一个使用UIAppearance
干净的解决scheme。 我发现试图通过UIAppearance
为UIPickerView
内的任何UILabel
设置textColor
没有任何影响,但一个自定义的外观属性,简单地称为常规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:@[UIPickerView.class]]; pickerLabelProxy.textColorWorkaround = UIColor.lightGrayColor;