《简单的自定义DropDatePicker》-- UIPopoverController 和 代理 以及 Block 实现。



最近做项目为了方便项目使用,自定义的空间 写的比较粗糙。欢迎大家批评指正。
以上为在项目中的实际应用


  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


 



 
 
 
 
 
原文地址:https://www.cnblogs.com/xiaohaoweiye/p/4368200.html