如何更改UIDatePicker的颜色?

3
如果有人想知道如何更改UIDatePicker的背景颜色(围绕实际旋转器的部分),请参见下面的答案。
1个回答

1

如果你想设置颜色,只需更改createCover方法并将cover设置为你想要的颜色即可。

//CustomizableDatePicker.m

#import "CustomizableDatePicker.h"
#import <QuartzCore/QuartzCore.h>

#define TOP_HEIGHT 9.7f
#define BOTTOM_HEIGHT TOP_HEIGHT
#define DATE_AND_TIME_MODE_ACTUAL_PICKER_WIDTH 302.5f
#define DATE_MODE_ACTUAL_PICKER_WIDTH 280.0f
#define TIME_MODE_ACTUAL_PICKER_WIDTH 176.0f

@interface CustomizableDatePicker()
@property (nonatomic, weak) UIView *myLeftCover;
@property (nonatomic, weak) UIView *myRightCover;
@property (nonatomic, weak) UIView *myTopCover;
@property (nonatomic, weak) UIView *myBottomCover;
@end

@implementation CustomizableDatePicker
@synthesize myLeftCover = _myLeftCover, myRightCover = _myRightCover, myTopCover = _myTopCover, myBottomCover = _myBottomCover;

- (void) setDatePickerMode:(UIDatePickerMode)datePickerMode
{
    [super setDatePickerMode:datePickerMode];

    [self setNeedsLayout];
}

- (void) awakeFromNib
{
    [self addCoverViews];
    self.layer.cornerRadius = 10;
    self.clipsToBounds = YES;
    [self setNeedsLayout];
    [self setNeedsDisplay];
}

- (id) init
{
    if(self = [super init])
    {
        [self addCoverViews];
        self.layer.cornerRadius = 10;
        self.clipsToBounds = YES;
        [self setNeedsLayout];
        [self setNeedsDisplay];
    }

    return self;
}

/*
 * Creates, but does NOT set the frames of, the 4 covers
 */
- (void) addCoverViews
{
    UIView *left = [self createCover];
    self.myLeftCover = left;
    [self addSubview:left];

    UIView *right = [self createCover];
    self.myRightCover = right;
    [self addSubview:right];

    UIView *top = [self createCover];
    self.myTopCover = top;
    [self addSubview:top];

    UIView *bottom = [self createCover];
    self.myBottomCover = bottom;
    [self addSubview:bottom];
}

/*
 * Helper function to create one cover
 */
- (UIView *) createCover;
{
    UIView *cover = [[UIView alloc] init];
    cover.backgroundColor = [UIColor whiteColor];
    cover.alpha = .55;
    return cover;
}

- (void) layoutSubviews
{
    float pickerWidth;
    if(self.datePickerMode == UIDatePickerModeDateAndTime)
    {
        pickerWidth = DATE_AND_TIME_MODE_ACTUAL_PICKER_WIDTH;
    }
    else if(self.datePickerMode == UIDatePickerModeDate)
    {
        pickerWidth = DATE_MODE_ACTUAL_PICKER_WIDTH;
    }
    else if(self.datePickerMode == UIDatePickerModeTime)
    {
        pickerWidth = TIME_MODE_ACTUAL_PICKER_WIDTH;
    }
    // Set left frame
    {
        float xOrigin = 0;
        float yOrigin = TOP_HEIGHT;
        float width = (self.frame.size.width - pickerWidth) / 2;
        float height = self.frame.size.height - TOP_HEIGHT - BOTTOM_HEIGHT ;
        self.myLeftCover.frame = CGRectMake(xOrigin, yOrigin, width, height);
    }
    // Set top frame
    {
        float xOrigin = 0;
        float yOrigin = 0;
        float width = self.frame.size.width;
        float height = TOP_HEIGHT;
        self.myTopCover.frame = CGRectMake(xOrigin, yOrigin, width, height);
    }
    // Set right frame
    {
        float xOrigin = (self.frame.size.width - pickerWidth) / 2 + pickerWidth;
        float yOrigin = TOP_HEIGHT;
        float width = (self.frame.size.width - pickerWidth) / 2;
        float height = self.frame.size.height - TOP_HEIGHT - BOTTOM_HEIGHT ;
        self.myRightCover.frame = CGRectMake(xOrigin, yOrigin, width, height);
    }
    // Set bottom frame
    {
        float xOrigin = 0;
        float yOrigin = self.frame.size.height - BOTTOM_HEIGHT;
        float width = self.frame.size.width;
        float height = BOTTOM_HEIGHT;
        self.myBottomCover.frame = CGRectMake(xOrigin, yOrigin, width, height);
    }
}

@end




//CustomizableDatePicker.h
#import <UIKit/UIKit.h>

/*
 * Allows for changing the color of UIDatePickers...Pretty useful, huh? :)
 */
@interface CustomizableDatePicker : UIDatePicker

@end

一直在寻找像这样的东西,找到了一个覆盖层类,但它会大大减慢加载时间,所以我真的很想使用这个。我对CoreAnimation不是很擅长,所以我在这里问...有没有办法将角落变圆?这样选择器就会更自然,像默认的那样?如果你能帮我解决问题,或者至少指导我如何自己解决它,那就太棒了;我不排斥学习。谢谢! - Roland
我真的没有时间给你一个完整的解释,但这是如何为UIView制作圆角的方法:https://dev59.com/uXI_5IYBdhLWcg3wJPdu - Nosrettap
很遗憾我没有恰当地提问,当时有点晚了 :) 内部角落必须是圆形的(向内)。基本的UIView圆角并不是很有用。感谢您抽出时间回答,如果将来您有一点空闲时间,调整这个类并使其达到默认标准将是非常棒的。再次感谢! - Roland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接