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

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