zoukankan      html  css  js  c++  java
  • 《简单的自定义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
    
    
    
     


    
    
     
     
     
     
     
  • 相关阅读:
    Alpha冲刺(5/10)
    Alpha冲刺(4/10)
    团队现场编程
    关于合同标准形的专题讨论
    关于相似标准形的专题讨论
    关于数学分析的计算题I(积分)
    关于数学分析的证明题III(级数)
    关于数学分析的证明题II(微分)
    关于数学分析的证明题I(积分)
    关于反常积分收敛的专题讨论
  • 原文地址:https://www.cnblogs.com/xiaohaoweiye/p/4368200.html
Copyright © 2011-2022 走看看