UI进阶之UIDatePicker键盘处理

一:常用属性

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

@property (nonatomic, retain) NSLocale   *locale;   // 语言环境,默认[NSLocale currentLocale],nil使用默认值

@property (nonatomic, retain) NSDate *date;// 当前时间

二:自定义键盘及键盘上的UIToolbar

//自定义文本框弹出键盘

通过设置UITextField的inputView属性来修改当文本框获得焦点后,弹出什么控件。设置该属性的值为UIDatePicker控件。(动态创建一个UIDatePicker控件(无需设置高宽)),这样就可以实现当文本框获得焦点后,自定义弹出键盘了。

 /** 参考代码:
     - (void)viewDidLoad {
         [super viewDidLoad];
     
         // 创建UIDatePicker对象
         UIDatePicker *datePicker = [[UIDatePicker alloc] init];
     
         // 设置语言区域
         datePicker.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh-Hans"];
     
         // 设置显示模式
         datePicker.datePickerMode = UIDatePickerModeDateAndTime;
     
         // 设置文本框, 当输出的时候显示的键盘是日期选择控件
         self.txtDate.inputView = datePicker;
     }
     
     */

// 自定义键盘上的工具控件

 设置文本框的inputAccessoryView属性。比如:txtField.inputAccessoryView = 某个UIView;

     ** 工具条的使用: UIToolbar, 演示设置工具条背景色、 设置背景色透明。(barTintColor,从iOS7开始;backgroundColor继承自UIView, 从iOS2开始。)

 /** 设置键盘工具条的参考代码:
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // 创建UIDatePicker对象
        UIDatePicker *datePicker = [[UIDatePicker alloc] init];
    
        // 设置语言区域
        datePicker.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh-Hans"];
    
        // 设置显示模式
        datePicker.datePickerMode = UIDatePickerModeDateAndTime;
    
        // 设置文本框, 当输出的时候显示的键盘是日期选择控件
        self.txtDate.inputView = datePicker;
        
        self.keyboardDatePicker = datePicker;
        
        // 为日期控件注册一个值改变事件
        [datePicker addTarget:self action:@selector(datepickerValueChanged) forControlEvents:UIControlEventValueChanged];
        
        // ====================== 设置文本框弹出键盘时的工具条 ======================
        // 1. 创建工具条
        UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
        
        // 2.向工具条中增加一些按钮(UIBarButtonItem)
        UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithTitle:@"上一个" style:UIBarButtonItemStylePlain target:self action:@selector(previousClick:)];
        
        UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithTitle:@"下一个" style:UIBarButtonItemStylePlain target:self action:@selector(nextClick:)];
        
        
        UIBarButtonItem *item3 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
        
        UIBarButtonItem *item4 = [[UIBarButtonItem alloc] initWithTitle:@"完成" style:UIBarButtonItemStylePlain target:self action:@selector(doneClick:)];
        
        // 将按钮添加到toolBar中
        toolBar.items = @[item1, item2, item3, item4];
        
        
        // 设置工具条到文本框的inputAccessoryView属性
        self.txtDate.inputAccessoryView = toolBar;
        // ====================== 设置文本框弹出键盘时的工具条 ======================
    
    }
    
    
    */
设置UIDatePicker的datepickerMode、Locale
      * picker.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh-Hans"];
                           
      * picker.datePickerMode = UIDatePickerModeDateAndTime;
                           
      ** 当日期选择控件选择的日期改变后, 将新的日期设置到文本框内。
         ** 思路:为日期选择控件注册ValueChanged事件, 当该事件被触发时获取日期, 并显示到文本框中。
                           
         ** 拖一个UIDatePicker到View中, 然后拖线到控制器, 查看Action中的事件(最常用的就是Value Changed事件)
                           
            /** 参考代码:
             [self.datePicker addTarget:self action:@selector(dpDateChanged) forControlEvents:UIControlEventValueChanged];
             
             - (void)dpDateChanged
             {
                 // 创建日期格式化器
                 NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
                 // 设置日期格式
                 formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
                 
                 // 格式化日期、
                 self.txtDate.text = [formatter stringFromDate:self.datePicker.date];
             
                 // 关闭键盘
                 [self.view endEditing:YES];
             }
         
         */

代码实例:

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *textField;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // 创建UIDatePicker对象
    UIDatePicker *date = [[UIDatePicker alloc] init];
    
    // 设置属性 本地化/日期格式
    date.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh-Hans"];
    date.datePickerMode = UIDatePickerModeDate;
    date.backgroundColor = [UIColor lightGrayColor];
    
#warning
    // 监听UIDatePicker的valueChange事件,一般情况下继承自UIControl的控件的事件可以通过addTarget
    // 没有继承UIControl的控件通过代理或通知来监听事件
    [date addTarget:self action:@selector(valueChange:) forControlEvents:UIControlEventValueChanged];
    
    // textFiled设置日期键盘
    self.textField.inputView = date;
    
    // textFiled设置辅助键盘
    // 默认toolbar不设置frame是不会显示的
    UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
    // 给toolbar设置背景色,默认backgroundColor不行,因为backgroundColor属性是toolbar继承UIView的属性,如果要设置toolbar的背景色需要设置toolbar的barTintColor属性
    toolbar.barTintColor = [UIColor grayColor];
    
    // 在toolbar上添加barbuttonItem
    UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithTitle:@"上一个"  style:UIBarButtonItemStylePlain target:nil action:nil];
    UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithTitle:@"下一个"  style:UIBarButtonItemStylePlain target:nil action:nil];
    UIBarButtonItem *item3 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *item4 = [[UIBarButtonItem alloc] initWithTitle:@"完成"  style:UIBarButtonItemStylePlain target:self action:@selector(doneClick)];
    
    toolbar.items = @[item1, item2, item3, item4];
    self.textField.inputAccessoryView = toolbar;
}

#pragma mark - UIDatePicker的值改变
- (void)valueChange:(UIDatePicker *)date
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyy-MM-dd";
    NSString *text = [formatter stringFromDate:date.date];
    
    self.textField.text = text;
}

- (void)doneClick
{
    [self.view endEditing:YES];
}

@end

效果:

原文地址:https://www.cnblogs.com/-boy/p/4147548.html