iOS常用控件封裝-SZKDatePicker(基于UIDatePicker的封裝)

一直想寫贞瞒,一直拖著偶房,終于,終于又靜下心來军浆,隨手寫寫棕洋。。乒融。

最近項目中遇到一個這樣一個需求掰盘,就是好多頁面都需要時間彈框控件,點擊按鈕彈出來一個datePicker,選中時間后赞季,點擊確定獲取到所選時間愧捕,點擊取消將datePicker移除,需求也挺簡單的申钩,實現(xiàn)起來也很容易次绘,系統(tǒng)提供的UIDatePicker完全可以滿足,但是由于調(diào)用的頁面比較多典蜕,秉著代碼能復用就封裝的原則断盛,筆者將UIDatePicker簡單封裝成SZKDatePicker,實現(xiàn)了一句代碼就可以調(diào)用控件愉舔,分享給大家钢猛,請大家批評指教。

(底部附本demo的GitHub鏈接轩缤,請仔細尋找)命迈。

先上效果圖:

在底部彈出一個時間控件

調(diào)用代碼:
在ViewController.m導入#import "SZKDatePicker.h"
點擊屏幕調(diào)用SZKDatePicker,彈出控件火的,點擊確定按鈕輸出選中的時間壶愤,一行代碼調(diào)用,童叟無欺馏鹤。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor=[UIColor yellowColor];
}
#pragma mark---點擊屏幕調(diào)用SZKDatePicker
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //調(diào)用SZKDatePicker
    [SZKDatePicker datePickerShow:^(NSString *curDateStr) {
        NSLog(@"選中的日期為:%@",curDateStr);
    }];
}

實現(xiàn)方法:
SZKDatePicker.h

#import <UIKit/UIKit.h>

typedef void(^GetCurDateBlock)(NSString *curDateStr);

@interface SZKDatePicker : UIView

//控件展示
+(instancetype)datePickerShow:(GetCurDateBlock)getCurDateBlock;

@end

SZKDatePicker.m

#import "SZKDatePicker.h"

//屏幕寬度
#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
//屏幕高度
#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
//控件高度
#define DatePickerHeight    200
//工具條高度
#define ToolBarHeight       40
//輸出時間格式
#define DateFormatter       @"yyyy-MM-dd"

@interface SZKDatePicker ()

@property(nonatomic,retain)UIView *dateBgView;//時間彈框背景view
@property(nonatomic,retain)UIDatePicker *datePicker;//時間彈框控件
@property(nonatomic,retain)UIToolbar *dateToolBar;//時間彈框工具條
//返回當前時間的block
@property(nonatomic,copy)GetCurDateBlock getCurDateBlock;

@end

@implementation SZKDatePicker

+(instancetype)datePickerShow:(GetCurDateBlock)getCurDateBlock
{
    SZKDatePicker *datePicker=[[SZKDatePicker alloc]initWithFrame:[UIScreen mainScreen].bounds];
    datePicker.getCurDateBlock=getCurDateBlock;
    //展示到最頂層
    [[UIApplication sharedApplication].keyWindow addSubview:datePicker];
    return datePicker;
}

-(instancetype)initWithFrame:(CGRect)frame
{
    self=[super initWithFrame:frame];
    if (self) {
        _dateBgView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
        _dateBgView.backgroundColor=[UIColor blackColor];
        _dateBgView.alpha=0.5;
        [self addSubview:_dateBgView];
        //添加手勢
        UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap)];
        [_dateBgView addGestureRecognizer:tap];
        //添加日期控件
        _datePicker=[[UIDatePicker alloc]initWithFrame:CGRectMake(0, SCREEN_HEIGHT-DatePickerHeight, SCREEN_WIDTH, DatePickerHeight)];
        //在此修改控件上時間展示格式
        _datePicker.datePickerMode=UIDatePickerModeDate;
        _datePicker.backgroundColor=[UIColor whiteColor];
        [self addSubview:_datePicker];
        //添加工具欄
        _dateToolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, CGRectGetMinY(_datePicker.frame)-ToolBarHeight, SCREEN_WIDTH, ToolBarHeight)];
        [self addSubview:_dateToolBar];
        //取消按鈕
        UIBarButtonItem *cancelBt=[[UIBarButtonItem alloc]initWithTitle:@"取消" style:UIBarButtonItemStylePlain target:self action:@selector(cancelBtClick)];
        //中間空隙
        UIBarButtonItem *midBt=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
        //確定按鈕
        UIBarButtonItem *sureBt=[[UIBarButtonItem alloc]initWithTitle:@"確定" style:UIBarButtonItemStylePlain target:self action:@selector(sureBtClick:)];
        //添加到toolBar
        _dateToolBar.items=@[cancelBt,midBt,sureBt];
    }
    return self;
}
#pragma mark---單擊手勢事件
-(void)tap
{
    [_dateBgView removeFromSuperview];
    [_datePicker removeFromSuperview];
    [_dateToolBar removeFromSuperview];
    _dateBgView=nil;
    _datePicker=nil;
    _dateToolBar=nil;
    //移除當前控件
    [self removeFromSuperview];
    _datePicker=nil;
}
#pragma mark---取消按鈕點擊
-(void)cancelBtClick
{
    [_dateBgView removeFromSuperview];
    [_datePicker removeFromSuperview];
    [_dateToolBar removeFromSuperview];
    _dateBgView=nil;
    _datePicker=nil;
    _dateToolBar=nil;
    //移除當前控件
    [self removeFromSuperview];
    _datePicker=nil;
}
#pragma mark---確定按鈕點擊
-(void)sureBtClick:(UIButton *)sender
{
    //將選中的日期返回到頁面上面
    self.getCurDateBlock([self curDateStr:_datePicker.date]);
    [_dateBgView removeFromSuperview];
    [_datePicker removeFromSuperview];
    [_dateToolBar removeFromSuperview];
    _dateBgView=nil;
    _datePicker=nil;
    _dateToolBar=nil;
    //移除當前控件
    [self removeFromSuperview];
    _datePicker=nil;
}
#pragma mark---獲得當前時間年月日
-(NSString *)curDateStr:(NSDate *)date
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
    [dateFormatter setDateFormat:DateFormatter];
    NSString *dateStr = [dateFormatter stringFromDate:date];
    return dateStr;
}

@end

以上就是整體的實現(xiàn)思路了征椒,方法上面都有注釋,基本上就這些了湃累,如果有任何問題勃救,可以隨時聯(lián)系筆者碍讨,下面??有聯(lián)系方式。

附:本demo的GitHub鏈接:
https://github.com/18811314750/SZKDatePicker

筆者的其他文章集錦:iOS知識點分享http://www.reibang.com/nb/4004224

如果有不足或者錯誤的地方還望各位讀者批評指正蒙秒,可以評論留言勃黍,筆者收到后第一時間回復。
QQ/微信:790057066 晕讲。
簡書號:iOS_凱http://www.reibang.com/users/86b0ddc92021/latest_articles
GitHub個人主頁(歡迎star):https://github.com/18811314750

感謝各位觀眾老爺?shù)拈喿x覆获,如果覺得筆者寫的還湊合,可以關(guān)注或收藏一下瓢省,不定期分享一些好玩的實用的demo給大家弄息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市勤婚,隨后出現(xiàn)的幾起案子疑枯,更是在濱河造成了極大的恐慌,老刑警劉巖蛔六,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荆永,死亡現(xiàn)場離奇詭異,居然都是意外死亡国章,警方通過查閱死者的電腦和手機具钥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來液兽,“玉大人骂删,你說我怎么就攤上這事∷膯” “怎么了宁玫?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柑晒。 經(jīng)常有香客問我欧瘪,道長,這世上最難降的妖魔是什么匙赞? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任佛掖,我火速辦了婚禮,結(jié)果婚禮上涌庭,老公的妹妹穿的比我還像新娘芥被。我一直安慰自己,他們只是感情好坐榆,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布拴魄。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匹中。 梳的紋絲不亂的頭發(fā)上蚀狰,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音职员,去河邊找鬼。 笑死跛溉,一個胖子當著我的面吹牛焊切,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芳室,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼专肪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了堪侯?” 一聲冷哼從身側(cè)響起嚎尤,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伍宦,沒想到半個月后芽死,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡次洼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年关贵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卖毁。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡揖曾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亥啦,到底是詐尸還是另有隱情炭剪,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布翔脱,位于F島的核電站奴拦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏届吁。R本人自食惡果不足惜粱坤,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓷产。 院中可真熱鬧站玄,春花似錦、人聲如沸濒旦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晾剖,卻和暖如春锉矢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背齿尽。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工沽损, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人循头。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像卡骂,于是被迫代替她去往敵國和親国裳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容