1 // DropDownDatePicker.h
2 // DropDownDatePickerDemo
3 //
4 // Created by HRP on 15/3/25.
5 // Copyright (c) 2015年 HRP. All rights reserved.
6 //
7
8 #import <UIKit/UIKit.h>
9 typedef NS_ENUM(NSInteger, DropDownDatePickerMode)
10 {
11 DropDownDatePickerModeDate,
12 DropDownDatePickerModeTime
13 };
14
15 @interface DropDownDatePicker : UIView
16
17 - (id)initWithFrame:(CGRect)frame dateMode:(DropDownDatePickerMode)mode;
18
19 @property (nonatomic, copy) void(^dateChangeHandler)(NSDate *);
20
21 @property (nonatomic, readonly) UILabel *titleLabel;
22 @property (nonatomic, readonly) UIBarButtonItem *confrimButton;
23
24 @property (nonatomic,strong ) UIColor *dateTextColor; //Default is Blue
25 @property (nonatomic,strong ) UIFont *dateTextFont; //Default is 14.0
26
27 @property (nonatomic,strong ) NSDate *currentDate; //Default is [NSDate date]
28
29 @property (nonatomic,retain ) NSDate *minimumDate; //Default is nil
30 @property (nonatomic,retain ) NSDate *maximumDate; //Default is nil
31
32 @property (nonatomic,assign ) NSInteger minuteInterval;
33
34
35 @end
36
37 ===== 如下爲DropDownDatePicker.m======
38
39 //
40 // DropDownDatePicker.m
41 // DropDownDatePickerDemo
42 //
43 // Created by HRP on 15/3/25.
44 // Copyright (c) 2015年 HRP. All rights reserved.
45 //
46
47 #import "DropDownDatePicker.h"
48
49 @protocol HRPDropDownDatePickerControllerDelegate <NSObject>
50
51 @required
52
53 - (void)datePickerControllerNeedDismiss;
54 - (void)datePickerControllerDateChanged:(NSDate *)newDate;
55
56 @end
57
58 @interface HRPDropDownDatePickerController : UIViewController
59
60 - (id)initWithDatePickerMode:(DropDownDatePickerMode)mode;
61
62 @property (nonatomic) UIPopoverController *popover;
63
64 @property (nonatomic,readonly ) UILabel *titleLable;
65 @property (nonatomic,readonly ) UIBarButtonItem *confrimButton;
66 @property (nonatomic,readwrite) NSDate *currentDate;
67
68 @property (nonatomic,weak)id<HRPDropDownDatePickerControllerDelegate> delegate;
69
70 @property (nonatomic,retain) NSDate *minimumDate;
71 @property (nonatomic,retain) NSDate *maxmumDate;
72 @property (nonatomic) NSInteger minuteInterval;
73
74 @end
75
76 @implementation HRPDropDownDatePickerController
77 {
78 DropDownDatePickerMode _mode;
79 UIDatePicker *_picker;
80 NSDate *_lastDate;
81 }
82
83 - (id)initWithDatePickerMode:(DropDownDatePickerMode)mode
84 {
85 if (self = [super init])
86 {
87 _mode = mode;
88 }
89 return self;
90 }
91
92 - (void)viewDidLoad
93 {
94 _confrimButton = [[UIBarButtonItem alloc] initWithTitle:@"OK"
95 style:UIBarButtonItemStyleDone
96 target:self action:@selector(dismiss)];
97
98 self.navigationItem.rightBarButtonItem = _confrimButton;
99
100 _titleLable = [[UILabel alloc] initWithFrame:CGRectMake(0, 10, 70, 30)];
101 _titleLable.textColor = [UIColor blueColor];
102 _titleLable.font = [UIFont systemFontOfSize:17];
103 self.navigationItem.titleView = _titleLable;
104
105 _picker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 250, 200 - 44)];
106 _picker.datePickerMode = (_mode == DropDownDatePickerModeDate)?UIDatePickerModeDate:UIDatePickerModeTime;
107 [self.view addSubview:_picker];
108 }
109
110 - (void)dismiss
111 {
112 _lastDate = self.currentDate;
113
114 if (![self.currentDate isEqual:_lastDate])
115 {
116 if (_delegate) {
117 [_delegate datePickerControllerDateChanged:self.currentDate];
118 }
119 }
120 if (_delegate) {
121 [_delegate datePickerControllerNeedDismiss];
122 }
123 }
124
125 - (void)setCurrentDate:(NSDate *)currentDate
126 {
127 [_picker setDate:currentDate animated:YES];
128 }
129
130 - (void)setMaxmumDate:(NSDate *)maxmumDate
131 {
132 _picker.maximumDate = maxmumDate;
133 }
134
135 - (void)setMinimumDate:(NSDate *)minimumDate
136 {
137 _picker.minimumDate = minimumDate;
138 }
139
140 - (NSDate *)currentDate
141 {
142 return _picker.date;
143 }
144
145 - (NSDate *)maxmumDate
146 {
147 return _picker.maximumDate;
148 }
149
150 - (NSDate *)minimumDate
151 {
152 return _picker.minimumDate;
153 }
154
155 - (void)setMinuteInterval:(NSInteger)minuteInterval
156 {
157 _picker.minuteInterval = minuteInterval;
158 }
159
160 @end
161
162 @interface DropDownDatePicker()
163 <HRPDropDownDatePickerControllerDelegate>
164
165 @end
166
167 @implementation DropDownDatePicker
168 {
169 UIButton *_button;
170 UIPopoverController *_popover;
171 HRPDropDownDatePickerController *_controller;
172 DropDownDatePickerMode _mode;
173 BOOL _needNotify;
174 }
175
176 - (id)initWithFrame:(CGRect)frame
177 dateMode:(DropDownDatePickerMode)mode
178 {
179 self = [super initWithFrame:frame];
180 if (self) {
181 _needNotify = NO;
182 _mode = mode;
183 UIImage *arrowImage = [UIImage imageNamed:@"HZDropDownDatePickerDownArrow"];
184 CGRect imageViewFrame = CGRectMake(CGRectGetWidth(self.bounds) - arrowImage.size.width - 10, 10, arrowImage.size.width, arrowImage.size.height);
185
186 UIImageView *imageView = [[UIImageView alloc] initWithFrame:imageViewFrame];
187 imageView.image = arrowImage;
188 imageView.backgroundColor = [UIColor redColor];
189 [self addSubview:imageView];
190
191 _button = [UIButton buttonWithType:UIButtonTypeSystem];
192 _button.contentVerticalAlignment = UIControlContentHorizontalAlignmentLeft;
193 _button.titleLabel.font = [UIFont systemFontOfSize:14.0];
194 _button.frame = self.bounds;
195 [_button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
196
197 [_button addTarget:self
198 action:@selector(showPopover)
199 forControlEvents:UIControlEventTouchUpInside];
200
201 [self addSubview:_button];
202
203 _controller = [[HRPDropDownDatePickerController alloc] initWithDatePickerMode:mode];
204 _controller.delegate = self;
205
206 UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:_controller];
207 if (!_popover) {
208 _popover = [[UIPopoverController alloc] initWithContentViewController:navi];
209 _popover.popoverContentSize = CGSizeMake(250, 200);
210 }
211 else {
212 [_popover setContentViewController:navi];
213 }
214 self.currentDate = [NSDate date];
215 }
216 return self;
217 }
218
219 - (UILabel *)titleLabel
220 {
221 return _controller.titleLable;
222 }
223
224 - (NSDate *)currentDate{
225 return _controller.currentDate;
226 }
227
228 - (void)setDateTextFont:(UIFont *)dateTextFont
229 {
230 _button.titleLabel.font = dateTextFont;
231 }
232
233 - (UIFont *)dateTextFont
234 {
235 return _button.titleLabel.font;
236 }
237
238 - (void)setDateTextColor:(UIColor *)dateTextColor
239 {
240 [_button setTitleColor:dateTextColor forState:UIControlStateNormal];
241 }
242
243 - (UIColor *)dateTextColor
244 {
245 return [_button titleColorForState:UIControlStateNormal];
246 }
247
248 - (void)setCurrentDate:(NSDate *)currentDate
249 {
250 _controller.currentDate = currentDate;
251 _needNotify = NO;
252 [self datePickerControllerDateChanged:currentDate];
253 }
254
255 - (void)setMaximumDate:(NSDate *)maximumDate
256 {
257 _controller.maxmumDate = maximumDate;
258 }
259
260 - (NSDate *)maximumDate
261 {
262 return _controller.minimumDate;
263 }
264
265 - (void)setMinimumDate:(NSDate *)minimumDate
266 {
267 _controller.minimumDate = minimumDate;
268 }
269
270 - (NSDate *)minimumDate
271 {
272 return _controller.minimumDate;
273 }
274
275 - (NSInteger)minuteInterval{
276 return _controller.minuteInterval;
277 }
278
279 - (void)setMinuteInterval:(NSInteger)minuteInterval{
280 _controller.minuteInterval = minuteInterval;
281 }
282
283 -(UIBarButtonItem *)confrimButton{
284 return _controller.confrimButton;
285 }
286
287 #pragma mark -
288 #pragma mark delegate
289
290 - (void)datePickerControllerNeedDismiss
291 {
292 [_popover dismissPopoverAnimated:YES];
293 }
294
295 - (void)datePickerControllerDateChanged:(NSDate *)newDate
296 {
297 NSString *dateString;
298 NSDateFormatter* formater = [[NSDateFormatter alloc] init];
299 if(_mode == DropDownDatePickerModeDate){
300 formater.dateFormat = @"yyyy年 MM月 dd日";
301 }
302 else if(_mode == DropDownDatePickerModeTime){
303 formater.dateFormat = @"hh: mm";
304 }
305
306 dateString = [formater stringFromDate:newDate];
307 [_button setTitle:dateString forState:UIControlStateNormal];
308
309 if(_dateChangeHandler && _needNotify){
310 _dateChangeHandler(newDate);
311 }
312 _needNotify = YES;
313 }
314
315 #pragma mark Private Methods
316
317 - (void)showPopover
318 {
319 CGFloat x = self.bounds.size.width / 2;
320 CGFloat y = self.bounds.size.height / 2;
321
322 [_popover presentPopoverFromRect:CGRectMake(x, y, 10, 10)
323 inView:_button
324 permittedArrowDirections:UIPopoverArrowDirectionAny
325 animated:YES];
326 }
327
328 @end