UIDatePicker

UIDatePicker 对象是用于输入日期和时间值的控件。 你可以使用日期选择器来允许用户输入时间点(日历日期,时间值或两者)或时间间隔(例如定时器)。 日期选择器会向与其相关联的目标对象(target)报告 用户交互行为。

Attributes 属性

核心属性

属性 描述
Mode 日期选择器模式。 确定日期选择器是否应显示时间,日期,时间和日期或倒计时间隔。 在运行时使用 datePickerMode 属性访问该值。
Locale 与日期选择器关联的区域设置。 该属性允许你设置指定区域来覆盖系统默认值。 您可以使用locale 属性以编程方式访问该属性。
Interval 分钟旋转器的间隔,如果在当前模式下显示。 默认值为1,最大值为30.您选择的值必须是除数为60(1,2,3,4,5,6,10,12,15,20,30)的除数。 在运行时使用 minuteInterval 属性访问该值。

时间属性

属性 描述
Date 日期选择器将显示的初始日期。 默认为当前日期,但您可以设置自定义值。 此属性等效于以编程方式设置 date 属性。
Constraints 日期选择器显示的可选日期的范围。 要使用动态范围,以编程方式配置 minimumDatemaximumDate 属性。 当 Mode 属性设置为倒计时器时,日期选择器将忽略这些选项。
Timer 日期选择器在倒计时模式下使用的初始值。 该值以秒为单位,但以分钟为单位显示。

Symbols

管理日期和日历

  • calendar
  • date
  • locale
  • setDate:animated:
  • timeZone

配置日期选择器模式

  • datePickerMode

    typedef enum UIDatePickerMode : NSInteger {
        UIDatePickerModeTime,
        UIDatePickerModeDate,
        UIDatePickerModeDateAndTime,
        UIDatePickerModeCountDownTimer
    } UIDatePickerMode;
    

配置时间属性

  • maximumDate

    日期选择器可以显示的最大日期。

  • minimumDate

    日期选择器可以显示的最小日期。

  • minuteInterval

    日期选择器应显示分钟的间隔。

  • countDownDuration

    mode 属性设置为 UIDatePickerModeCountDownTimer 时,日期选择器显示的值。

常量

  • UIDatePickerMode

使用

示例一:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    CGRect frame = CGRectMake(27, 100, 320, 216);
    // 创建 UIDatePicker 对象
    UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:frame];
    // 设置背景颜色
    datePicker.backgroundColor = [UIColor flatWhiteColor];
    // 设置日期选择器模式:日期模式
    datePicker.datePickerMode = UIDatePickerModeDate;
    // 设置可供选择的最小时间:昨天
    NSTimeInterval time = 24 * 60 * 60; // 24H 的时间戳值
    datePicker.minimumDate = [[NSDate alloc] initWithTimeIntervalSinceNow:- time];
    // 设置可供选择的最大时间:明天
    datePicker.maximumDate = [[NSDate alloc] initWithTimeIntervalSinceNow:time];
    // 添加 Target-Action
    [datePicker addTarget:self
                   action:@selector(datePickerValueChanged:)
         forControlEvents:UIControlEventValueChanged];
    // 将 UIDatePicker 对象添加到当前视图
    [self.view addSubview:datePicker];
}

- (void)datePickerValueChanged:(id)sender {
    // 直接打印 Data
//    UIDatePicker *datePicker = (UIDatePicker *)sender;
//    NSDate *date = datePicker.date;
//    NSLog(@"%@",date); // Sun Jul 30 15:28:17 2017
    
    // 格式化日期后再打印
    UIDatePicker *datePicker = (UIDatePicker *)sender;
    NSDate *date = datePicker.date;
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy年MM月dd日"];
    NSString *string = [dateFormatter stringFromDate:date];
    NSLog(@"%@",string); // 2017年07月29日
}

效果:

UIDatePicker_第1张图片

示例二:点击 UITextField 弹出 UIDatePicker 日期选择器

#import "ViewController.h"
#import "Chameleon.h"

@interface ViewController () 

@property (nonatomic, strong) UITextField *textField;
@property (nonatomic ,strong) UITextField *otherTextField;
@property (nonatomic, strong) UIDatePicker *datePicker;

@end

@implementation ViewController

#pragma mark - Lifecycle

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.view addSubview:self.textField];
    [self.view addSubview:self.otherTextField];
}

#pragma mark - Custom Accessors

- (UITextField *)textField {
    if (!_textField) {
        _textField = [[UITextField alloc] initWithFrame:CGRectMake(30, 100, 320, 44)];
        _textField.backgroundColor = [UIColor flatLimeColor];
        _textField.returnKeyType = UIReturnKeyDone;
        _textField.tag = 1001;
        _textField.delegate = self;
    }
    return _textField;
}

- (UITextField *)otherTextField {
    if (!_otherTextField) {
        _otherTextField = [[UITextField alloc] initWithFrame:CGRectMake(30, 160, 320, 44)];
        _otherTextField.backgroundColor = [UIColor flatBlueColor];
        _otherTextField.returnKeyType = UIReturnKeyDone;
        _otherTextField.tag = 1002;
        _otherTextField.delegate = self;
    }
    return _otherTextField;
}

- (UIDatePicker *)datePicker {
    if (!_datePicker) {
        // 创建 UIDatePicker 对象
        _datePicker = [[UIDatePicker alloc] init];
        // 设置背景颜色
        _datePicker.backgroundColor = [UIColor flatWhiteColor];
        // 设置日期选择器模式:日期模式
        _datePicker.datePickerMode = UIDatePickerModeDate;
        // 设置可供选择的最小时间:昨天
        NSTimeInterval time = 24 * 60 * 60; // 24H 的时间戳值
        _datePicker.minimumDate = [[NSDate alloc] initWithTimeIntervalSinceNow:- time];
        // 设置可供选择的最大时间:明天
        _datePicker.maximumDate = [[NSDate alloc] initWithTimeIntervalSinceNow:time];
        // 添加 Target-Action
        [_datePicker addTarget:self
                        action:@selector(datePickerValueChanged:)
              forControlEvents:UIControlEventValueChanged];
    }
    return _datePicker;
}

#pragma mark - IBActions

- (void)datePickerValueChanged:(id)sender {
    UIDatePicker *datePicker = (UIDatePicker *)sender;
    NSDate *date = datePicker.date;
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy年MM月dd日"];
    NSString *string = [dateFormatter stringFromDate:date];
    // 将日期赋值给 textField
    self.textField.text = string;
}

#pragma mark - UITextFieldDelegate

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    // 如果需要显示键盘,则隐藏 datePicker
    if (textField.tag != 1001) {
        if (self.datePicker.superview) {
            [self.datePicker removeFromSuperview];
        }
        return YES;
    }
    
    // 如果需要弹出日期选择器,则隐藏所有键盘
    [self.view endEditing:YES];
   
    // 以动画的方式显示日期选择器
    self.datePicker.frame = CGRectMake(0, [UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width, 216);
    [self.view addSubview:self.datePicker];
    
    [UIView animateWithDuration:0.3f animations:^{
        self.datePicker.frame = CGRectMake(0, [UIScreen mainScreen].bounds.size.height - 216, [UIScreen mainScreen].bounds.size.width, 216);
    } completion:^(BOOL finished) {
        
    }];
    return NO;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    return YES;
}

@end

效果:

UIDatePicker_第2张图片

示例2-2

textFileDate.inputView 设置成 UIDatePicker 可能更好:

// 1  声明datePicker设置弹出日期键盘的格式
datePicker = [[UIDatePicker alloc] init];

//datePicker.datePickerMode = UIDatePickerModeDateAndTime;
//datePicker.minuteInterval = 30;

[datePicker setDatePickerMode:UIDatePickerModeDate];

[datePicker addTarget:self
               action:@selector(chooseDate:)
     forControlEvents:UIControlEventValueChanged];

// 选择日期
-(void)chooseDate:(UIDatePicker *)sender {

NSDate *selectedDate = sender.date;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd";
NSString *dateString = [formatter stringFromDate:selectedDate];
textFileDate.text = dateString;
}

// 设置输入的界面是时间选择的datepicker
textFileDate.inputView = datePicker;

示例三:

项目需求需要做一个日期选择器,只显示年月,不需要显示日。

网上找到这篇文章,iOS-日期选择控件(可单独选年/年月/年月日) ,看源码实现非常麻烦。

看到 stackoverflow 上的提问 UIDatePicker select Month and Year

推荐还是自己写一个 UIPickerView 实现可能比较方便。

附录1 UIDatePicker源码

//
//  UIDatePicker.h
//  UIKit
//
//  Copyright (c) 2006-2015 Apple Inc. All rights reserved.
//

#import 
#import 
#import 

NS_ASSUME_NONNULL_BEGIN

// 日期选择器模式
typedef NS_ENUM(NSInteger, UIDatePickerMode) {
    UIDatePickerModeTime,           // 根据区域设置显示小时,分钟和可选的AM/PM(例如 6 | 53 | PM)
    UIDatePickerModeDate,           // 根据区域设置显示年月日(例如,11 | 15 | 2007)
    UIDatePickerModeDateAndTime,    // 根据区域设置显示日期,小时,分钟和可选的AM/PM(例如 Wed Nov 15 | 6 | 53 | PM)
    UIDatePickerModeCountDownTimer, // 显示小时和分钟(例如 1 | 53)
} __TVOS_PROHIBITED;

// **************************** UIDatePicker 头文件*****************************
NS_CLASS_AVAILABLE_IOS(2_0) __TVOS_PROHIBITED @interface UIDatePicker : UIControl 

// 日期选择器模式,默认为 UIDatePickerModeDateAndTime
@property (nonatomic) UIDatePickerMode datePickerMode; 

// 区域,默认为 [NSLocale currentLocale]. 设置为 nil 则返回默认值
@property (nullable, nonatomic, strong) NSLocale   *locale;

// 日历,默认 [NSCalendar currentCalendar]. 设置为 nil 则返回默认值
@property (null_resettable, nonatomic, copy)   NSCalendar *calendar;

// 时区,默认为 nil. use current time zone or time zone from calendar
@property (nullable, nonatomic, strong) NSTimeZone *timeZone; 

// 日期,当选择器创建时默认为当前日期。当选择 UIDatePickerModeCountDownTimer 模式时会被忽略,且选择器以 0:00 为起点
@property (nonatomic, strong) NSDate *date;        

// 指定最小/最大日期范围。 默认值为 nil。 当 min> max 时,这些值将被忽略。 
// 选择 UIDatePickerModeCountDownTimer 模式时忽略该值。
@property (nullable, nonatomic, strong) NSDate *minimumDate; 
@property (nullable, nonatomic, strong) NSDate *maximumDate; 

// 倒计时持续时间
// 当日期选择器的 mode 属性设置为 UIDatePickerModeCountDownTimer 时,使用此属性获取并设置当前选定的值。 此属性的类型为 NSTimeInterval,因此以秒为单位,尽管日期选择器仅显示小时和分钟。 如果日期选择器的模式不是 UIDatePickerModeCountDownTimer,则此值为 undefined; 参考date属性。 默认值为0.0,最大值为23:59(86,399秒)。
@property (nonatomic) NSTimeInterval countDownDuration; 

// 显示分钟转盘的时间间隔。 间隔必须均匀分为60.默认值为1. min为1,max为30
@property (nonatomic) NSInteger      minuteInterval;

// 如果动画为YES,则以动画方式转动时间转盘来显示新的日期
- (void)setDate:(NSDate *)date animated:(BOOL)animated; 

@end

NS_ASSUME_NONNULL_END

参考

  • 实现点击UITextField弹出UIDatePicker日期选择器

你可能感兴趣的:(UIDatePicker)