// DropDownDatePicker.h
// DropDownDatePickerDemo
//
// Created by HRP on 15/3/25.
// Copyright (c) 2015年 HRP. All rights reserved.
//
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSInteger, DropDownDatePickerMode)
{
DropDownDatePickerModeDate,
DropDownDatePickerModeTime
};
@interface DropDownDatePicker : UIView
- (id)initWithFrame:(CGRect)frame dateMode:(DropDownDatePickerMode)mode;
@property (nonatomic, copy) void(^dateChangeHandler)(NSDate *);
@property (nonatomic, readonly) UILabel *titleLabel;
@property (nonatomic, readonly) UIBarButtonItem *confrimButton;
@property (nonatomic,strong ) UIColor *dateTextColor; //Default is Blue
@property (nonatomic,strong ) UIFont *dateTextFont; //Default is 14.0
@property (nonatomic,strong ) NSDate *currentDate; //Default is [NSDate date]
@property (nonatomic,retain ) NSDate *minimumDate; //Default is nil
@property (nonatomic,retain ) NSDate *maximumDate; //Default is nil
@property (nonatomic,assign ) NSInteger minuteInterval;
@end
===== 以下为DropDownDatePicker.m======
//
// DropDownDatePicker.m
// DropDownDatePickerDemo
//
// Created by HRP on 15/3/25.
// Copyright (c) 2015年 HRP. All rights reserved.
//
#import "DropDownDatePicker.h"
@protocol HRPDropDownDatePickerControllerDelegate <NSObject>
@required
- (void)datePickerControllerNeedDismiss;
- (void)datePickerControllerDateChanged:(NSDate *)newDate;
@end
@interface HRPDropDownDatePickerController : UIViewController
- (id)initWithDatePickerMode:(DropDownDatePickerMode)mode;
@property (nonatomic) UIPopoverController *popover;
@property (nonatomic,readonly ) UILabel *titleLable;
@property (nonatomic,readonly ) UIBarButtonItem *confrimButton;
@property (nonatomic,readwrite) NSDate *currentDate;
@property (nonatomic,weak)id<HRPDropDownDatePickerControllerDelegate> delegate;
@property (nonatomic,retain) NSDate *minimumDate;
@property (nonatomic,retain) NSDate *maxmumDate;
@property (nonatomic) NSInteger minuteInterval;
@end
@implementation HRPDropDownDatePickerController
{
DropDownDatePickerMode _mode;
UIDatePicker *_picker;
NSDate *_lastDate;
}
- (id)initWithDatePickerMode:(DropDownDatePickerMode)mode
{
if (self = [super init])
{
_mode = mode;
}
return self;
}
- (void)viewDidLoad
{
_confrimButton = [[UIBarButtonItem alloc] initWithTitle:@"OK"
style:UIBarButtonItemStyleDone
target:self action:@selector(dismiss)];
self.navigationItem.rightBarButtonItem = _confrimButton;
_titleLable = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
_titleLable.textColor = [UIColor blueColor];
_titleLable.font = [UIFont systemFontOfSize:];
self.navigationItem.titleView = _titleLable;
_picker = [[UIDatePicker alloc] initWithFrame:CGRectMake(, , , - )];
_picker.datePickerMode = (_mode == DropDownDatePickerModeDate)?UIDatePickerModeDate:UIDatePickerModeTime;
[self.view addSubview:_picker];
}
- (void)dismiss
{
_lastDate = self.currentDate;
if (![self.currentDate isEqual:_lastDate])
{
if (_delegate) {
[_delegate datePickerControllerDateChanged:self.currentDate];
}
}
if (_delegate) {
[_delegate datePickerControllerNeedDismiss];
}
}
- (void)setCurrentDate:(NSDate *)currentDate
{
[_picker setDate:currentDate animated:YES];
}
- (void)setMaxmumDate:(NSDate *)maxmumDate
{
_picker.maximumDate = maxmumDate;
}
- (void)setMinimumDate:(NSDate *)minimumDate
{
_picker.minimumDate = minimumDate;
}
- (NSDate *)currentDate
{
return _picker.date;
}
- (NSDate *)maxmumDate
{
return _picker.maximumDate;
}
- (NSDate *)minimumDate
{
return _picker.minimumDate;
}
- (void)setMinuteInterval:(NSInteger)minuteInterval
{
_picker.minuteInterval = minuteInterval;
}
@end
@interface DropDownDatePicker()
<HRPDropDownDatePickerControllerDelegate>
@end
@implementation DropDownDatePicker
{
UIButton *_button;
UIPopoverController *_popover;
HRPDropDownDatePickerController *_controller;
DropDownDatePickerMode _mode;
BOOL _needNotify;
}
- (id)initWithFrame:(CGRect)frame
dateMode:(DropDownDatePickerMode)mode
{
self = [super initWithFrame:frame];
if (self) {
_needNotify = NO;
_mode = mode;
UIImage *arrowImage = [UIImage imageNamed:@"HZDropDownDatePickerDownArrow"];
CGRect imageViewFrame = CGRectMake(CGRectGetWidth(self.bounds) - arrowImage.size.width - , , arrowImage.size.width, arrowImage.size.height);
UIImageView *imageView = [[UIImageView alloc] initWithFrame:imageViewFrame];
imageView.image = arrowImage;
imageView.backgroundColor = [UIColor redColor];
[self addSubview:imageView];
_button = [UIButton buttonWithType:UIButtonTypeSystem];
_button.contentVerticalAlignment = UIControlContentHorizontalAlignmentLeft;
_button.titleLabel.font = [UIFont systemFontOfSize:14.0];
_button.frame = self.bounds;
[_button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
[_button addTarget:self
action:@selector(showPopover)
forControlEvents:UIControlEventTouchUpInside];
[self addSubview:_button];
_controller = [[HRPDropDownDatePickerController alloc] initWithDatePickerMode:mode];
_controller.delegate = self;
UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:_controller];
if (!_popover) {
_popover = [[UIPopoverController alloc] initWithContentViewController:navi];
_popover.popoverContentSize = CGSizeMake(, );
}
else {
[_popover setContentViewController:navi];
}
self.currentDate = [NSDate date];
}
return self;
}
- (UILabel *)titleLabel
{
return _controller.titleLable;
}
- (NSDate *)currentDate{
return _controller.currentDate;
}
- (void)setDateTextFont:(UIFont *)dateTextFont
{
_button.titleLabel.font = dateTextFont;
}
- (UIFont *)dateTextFont
{
return _button.titleLabel.font;
}
- (void)setDateTextColor:(UIColor *)dateTextColor
{
[_button setTitleColor:dateTextColor forState:UIControlStateNormal];
}
- (UIColor *)dateTextColor
{
return [_button titleColorForState:UIControlStateNormal];
}
- (void)setCurrentDate:(NSDate *)currentDate
{
_controller.currentDate = currentDate;
_needNotify = NO;
[self datePickerControllerDateChanged:currentDate];
}
- (void)setMaximumDate:(NSDate *)maximumDate
{
_controller.maxmumDate = maximumDate;
}
- (NSDate *)maximumDate
{
return _controller.minimumDate;
}
- (void)setMinimumDate:(NSDate *)minimumDate
{
_controller.minimumDate = minimumDate;
}
- (NSDate *)minimumDate
{
return _controller.minimumDate;
}
- (NSInteger)minuteInterval{
return _controller.minuteInterval;
}
- (void)setMinuteInterval:(NSInteger)minuteInterval{
_controller.minuteInterval = minuteInterval;
}
-(UIBarButtonItem *)confrimButton{
return _controller.confrimButton;
}
#pragma mark -
#pragma mark delegate
- (void)datePickerControllerNeedDismiss
{
[_popover dismissPopoverAnimated:YES];
}
- (void)datePickerControllerDateChanged:(NSDate *)newDate
{
NSString *dateString;
NSDateFormatter* formater = [[NSDateFormatter alloc] init];
if(_mode == DropDownDatePickerModeDate){
formater.dateFormat = @"yyyy年 MM月 dd日";
}
else if(_mode == DropDownDatePickerModeTime){
formater.dateFormat = @"hh: mm";
}
dateString = [formater stringFromDate:newDate];
[_button setTitle:dateString forState:UIControlStateNormal];
if(_dateChangeHandler && _needNotify){
_dateChangeHandler(newDate);
}
_needNotify = YES;
}
#pragma mark Private Methods
- (void)showPopover
{
CGFloat x = self.bounds.size.width / ;
CGFloat y = self.bounds.size.height / ;
[_popover presentPopoverFromRect:CGRectMake(x, y, , )
inView:_button
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
@end