封装日期控件   

我们用一个UIView 做为一个容器  将我们的日期控件放上去

上面有个Label 用来显示我们选择的时间 

下面两个Button 用来确定和取消  

这里值传递使用了Block 方式 当我们点击确定的时候 回调Block

将当前选择的时间回调给控制器,进行赋值操作 显示 当前时间

点击确定之后 将此控件从屏幕上移除 

点击取消按钮 直接将控件从屏幕上移除 并且将 显示日期的Label 内容制空

#import <UIKit/UIKit.h>

typedef void(^DatePickerTimerBlock)(NSString *DateStr);

typedef void(^btnConformBlock)(BOOL isOK);

typedef void(^btnCancelBlock)(BOOL isCancel);
@interface DatePickerView : UIView


@property(nonatomic, copy)void(^datePickerTimeBlock)(DatePickerView *date, NSString * str);

- (void)setDatePickerTimerBlock:(DatePickerTimerBlock)dateStr;

- (void)setBtnConformBlock:(btnConformBlock)btnConform;

- (void)setBtnCancelBlock:(btnCancelBlock)btnCancel;


@end



#import "DatePickerView.h"

@interface DatePickerView()
{
    DatePickerTimerBlock _pickerTimerBlock;
    
    btnConformBlock _btnConfromBlock;
    
    btnCancelBlock _btnCancelBlock;
}
/**
 *  日期控件
 */
@property (nonatomic, weak) UIDatePicker *datePicker;

@property (nonatomic, weak) UILabel *DateLabelText;

@property (nonatomic, weak) UIButton *btnConform;

@property (nonatomic, weak) UIButton *btnCancel;


@end


@implementation DatePickerView

- (UIButton *)btnConform
{
    if (!_btnConform) {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setTitle:@"确定" forState:UIControlStateNormal];
        [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        btn.backgroundColor = [UIColor orangeColor];
        [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:btn];
        btn.tag = 200;
         _btnConform = btn;
    }
    return _btnConform;
}

- (UIButton *)btnCancel
{
    if (!_btnCancel) {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setTitle:@"取消" forState:UIControlStateNormal];
        [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        btn.backgroundColor = [UIColor purpleColor];
        [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
        btn.tag = 201;
        [self addSubview:btn];
        _btnCancel = btn;
    }
    return _btnCancel;
}

- (void)btnClick:(UIButton *)btn
{
    if (btn.tag == 201) {
        
        if (_btnCancelBlock) {
            _btnCancelBlock(btn.tag);
        }
    }
    if (btn.tag == 200)
    {
        if (_btnConfromBlock) {
            _btnConfromBlock(btn.tag);
            [self removeFromSuperview];
        }
    }
}

- (UILabel *)DateLabelText
{
    if (!_DateLabelText) {
        UILabel *label = [[UILabel alloc]init];
        label.font = [UIFont systemFontOfSize:15];
        label.backgroundColor = [UIColor redColor];
        [self addSubview:label];
        label.textColor = [UIColor blackColor];
        
        label.text = @"日期:";
        label.textAlignment = NSTextAlignmentCenter;
        _DateLabelText = label;
    }
    return _DateLabelText;
}


/**
 *  setter 方法
 *
 *  @param dateStr
 */
- (void)setDatePickerTimerBlock:(DatePickerTimerBlock)dateStr
{
    _pickerTimerBlock = dateStr;
}


- (void)setBtnConformBlock:(btnConformBlock)btnConform
{
    _btnConfromBlock = btnConform;
}


- (void)setBtnCancelBlock:(btnCancelBlock)btnCancel
{
    _btnCancelBlock = btnCancel;
}

/**
 *  初始化控件
 *
 *  @return
 */

- (UIDatePicker *)datePicker
{
    if (!_datePicker) {
        UIDatePicker *datePicker = [[UIDatePicker alloc]init];
        
        datePicker.datePickerMode = UIDatePickerModeDateAndTime;
        
        //设置最大的选择日期
//        datePicker.maximumDate = [NSDate dateWithTimeIntervalSinceNow:3600];
        
        [datePicker addTarget:self action:@selector(dateChange:) forControlEvents:UIControlEventValueChanged];
        
        [self addSubview:datePicker];
        
        _datePicker = datePicker;
    }
    return _datePicker;
}




/**
 *  日期 改变了
 *
 *  @return
 */

- (void)dateChange:(UIDatePicker *)picker
{
    //1.获取当前选中的时间
    NSDate *date = picker.date;
    
    //2.将date 转化为字符串
     NSString *dateString = [self stringFormate:date];
    
    self.DateLabelText.text = dateString;
    
    if (self.datePickerTimeBlock) {
        self.datePickerTimeBlock(self,dateString);
    }
    
    
    dispatch_async(dispatch_get_main_queue(), ^{
        if (_pickerTimerBlock) {
            _pickerTimerBlock(dateString);
        }
    });
    
    NSLog(@"%@",dateString);
}


/**
 *  将时间转化为字符串
 *
 *  @return
 */

- (NSString *)stringFormate:(NSDate *)date
{
    //初始化日期格式类
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    
    formatter.dateFormat = @"yyyy-MM-dd";
    
    //将date 装化为字符串
    return [formatter stringFromDate:date];
    
}


- (void)layoutSubviews
{
    [super layoutSubviews];
    
    //设置坐标
//    self.datePicker.frame = self.bounds;
    self.datePicker.frame = CGRectMake(0, 30, self.frame.size.width, self.frame.size.width-60);
    self.DateLabelText.frame = CGRectMake(0, 0, self.frame.size.width, 30);
    
    self.btnConform.frame = CGRectMake(0, self.frame.size.height-30, self.frame.size.width/2, 30);
    
    self.btnCancel.frame = CGRectMake(self.frame.size.width/2, self.frame.size.height-30, self.frame.size.width/2, 30);
    
    
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

@end



#import "ViewController.h"

#import "DatePickerView.h"


@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *dateLabel;

@end

@implementation ViewController
- (IBAction)btnClick:(id)sender {
    
    DatePickerView *datePicker = [[DatePickerView alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height, self.view.frame.size.width, 216)];
    
    //动画
    [UIView animateWithDuration:0.25 animations:^{
        CGRect frame = datePicker.frame;
        frame.origin.y = self.view.frame.size.height - 216;
        datePicker.frame = frame;
    }];
    datePicker.backgroundColor = [UIColor cyanColor];
    
    [self.view addSubview:datePicker];
    
    __weak typeof (datePicker)weakSelf = datePicker;
    
    [datePicker setDatePickerTimeBlock:^( DatePickerView *pickerView,NSString *str) {
        
        [weakSelf setBtnConformBlock:^(BOOL isOK) {
            
            if (isOK) {
                self.dateLabel.text = str;
            }
            else
                self.dateLabel.text = @"";
        }];
        
//        [weakSelf removeFromSuperview];
        
    }];
    
    [weakSelf setBtnCancelBlock:^(BOOL isCancel) {

        self.dateLabel.text = @"";
        [weakSelf removeFromSuperview];

    }];
    
//    
//    [datePicker setBtnCancelBlock:^(BOOL isCancel) {
//        self.dateLabel.text = @"";
//    }];

    [datePicker setDatePickerTimerBlock:^(NSString *DateStr) {
//        self.dateLabel.text = DateStr;
    }];
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /**
     *  如何让一个Label上显示两种颜色 或者两种不同颜色的字体 
        我们可以用两种方式实现 
        1.使用CoreText 这种方式偏向 底层 实现起来较为复杂
        2.使用属性字符串
     *
     *  
     */
    
    [self show];
    [self showDate];
    [self numberFormater];
    
    // Do any additional setup after loading the view, typically from a nib.
}


- (void)showDate
{
    /**
     *  日历类
     *
     *  @return <#return value description#>
     */
    NSCalendar *calendar = [NSCalendar currentCalendar];
    
    /**
     *  获取系统当前时间
     *
     *  @return <#return value description#>
     */
    NSDate *date = [NSDate date];
    
    /**
     *  日期组件
     *
     *  保存 年月日时分秒周
     */
    
    /**
     *          
     NSCalendarUnitEra                = kCFCalendarUnitEra,
     NSCalendarUnitYear               = kCFCalendarUnitYear,
     NSCalendarUnitMonth              = kCFCalendarUnitMonth,
     NSCalendarUnitDay                = kCFCalendarUnitDay,
     NSCalendarUnitHour               = kCFCalendarUnitHour,
     NSCalendarUnitMinute             = kCFCalendarUnitMinute,
     NSCalendarUnitSecond             = kCFCalendarUnitSecond,
     NSCalendarUnitWeekday            = kCFCalendarUnitWeekday,
     NSCalendarUnitWeekdayOrdinal     = kCFCalendarUnitWeekdayOrdinal,
     *
     *  @param NSCalendarUnit <#NSCalendarUnit description#>
     *
     *  @return <#return value description#>
     */
//    NSDateComponents *componets = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday fromDate:date];
    
    NSDateComponents *componets = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday fromDate:date];
    
    /*
     周日:1
     周一:2
     */
    NSLog(@"%ld/%ld/%ld  周%ld",componets.year,componets.month,componets.day,componets.weekday - 1);
    
    NSDate *date1 = [NSDate date];
    NSDate *date2 = [NSDate dateWithTimeInterval:3600 sinceDate:date];
    
    /**
     *  1.两个时间相差多少秒 ABS
     *
     *  @return <#return value description#>
     */
    [date1 timeIntervalSinceDate:date2];
    
    /**
     *  2.date 距离1970年1月1号的秒数
     *
     *  @return <#return value description#>
     */
    NSTimeInterval seconds = [date1 timeIntervalSince1970];
    
    [date1 timeIntervalSinceReferenceDate];
    
    /**
     *  指定距离现在时间差多少秒
     *
     *  @return <#return value description#>
     */
    [date1 timeIntervalSinceNow];
    
    
    
}











- (void)show
{
    /**
     *  属性字符串
     *
     *  @return <#return value description#>
     */
    
    NSMutableAttributedString *attributeString = [[NSMutableAttributedString     alloc]initWithString: @"Can you see me ?"];
    /**
     *  指定范围添加属性
     *
     *  @return <#return value description#>
     */
    [attributeString addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:40],NSForegroundColorAttributeName:[UIColor redColor]} range:NSMakeRange(0, 1)];
    
    [attributeString addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15],NSForegroundColorAttributeName:[UIColor lightGrayColor]} range:NSMakeRange(1, 5)];
    [attributeString addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:25],NSForegroundColorAttributeName:[UIColor greenColor]} range:NSMakeRange(5, 10)];
    
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 50, 200, 50)];
    
    label.attributedText = attributeString;
    
    [self.view addSubview:label];
    
}


- (void)numberFormater
{
    /**
     *  数字格式化
     *
     *  @return
     */
    //在我们做项目的过程中 我们会遇到这样一个问题
    //将一个数字字符串 或者 整形 转化为指定的格式
    //例如电话号码178-9876-7489
    //金额 $1,983,234,234,987
    //将数字转化为大写
    //如果我们自己封装类是比较麻烦的 发现一个很好的方法推荐给大家
    //这个是 苹果给我们提供的一个数字格式化的类 这个类相当的强大
    
    /**
     我们可以使用 系统提供给我们的一些方法 这个就不挨个实验了
     typedef NS_ENUM(NSUInteger, NSNumberFormatterStyle) {
     NSNumberFormatterNoStyle = kCFNumberFormatterNoStyle,
     NSNumberFormatterDecimalStyle = kCFNumberFormatterDecimalStyle,
     NSNumberFormatterCurrencyStyle = kCFNumberFormatterCurrencyStyle,
     NSNumberFormatterPercentStyle = kCFNumberFormatterPercentStyle,
     NSNumberFormatterScientificStyle = kCFNumberFormatterScientificStyle,
     NSNumberFormatterSpellOutStyle = kCFNumberFormatterSpellOutStyle,
     };
     */
    
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc]init];
    /**
     *  设置样式
     *
     * @return
     */
    formatter.numberStyle = kCFNumberFormatterDecimalStyle;
    
    NSString *str = [formatter stringFromNumber:@(12973496236)];
    NSLog(@"%@",str);
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end



ios时间组件不动 ios 时间组件_自定义