iOS自定義時(shí)間選擇器之隱藏不需要的時(shí)間

因項(xiàng)目需求躯舔,需要用到一個(gè)時(shí)間選擇器,設(shè)置最大可選時(shí)間與最小可選時(shí)間省古,其它無(wú)效不可選的時(shí)間需要‘干’掉V嘧!豺妓!苦于找了一堆別人自定義的時(shí)間選擇器惜互,并沒有符合要求的。故而:自己寫了一個(gè)琳拭。只分享給有需要的人(demo已附上)训堆。
先看效果:


JDatepickerShow.gif

我是個(gè)實(shí)在人。一步一步來(lái)白嘁,先上.h文件

@protocol JXYDatePickerDelegate <NSObject>
@optional
//選中日期
-(void)didSelectedDateString:(NSString *)dateString;
//取消日期
-(void)cancelDatePicker;
@end
@interface JXYDatePicker : UIView
//代理
@property (nonatomic ,weak)id<JXYDatePickerDelegate>delegate;
-(instancetype)initWithFrame:(CGRect)frame WithMinimumDate:(NSDate *)minimumDate maximumDate:(NSDate *)maximumDate;
@end

簡(jiǎn)單易懂坑鱼!定義了一個(gè)代理及兩個(gè)方法,分別對(duì)應(yīng)確定按鈕與取消按鈕的點(diǎn)擊操作絮缅。
公開了一個(gè)方法鲁沥,即初始化這個(gè)時(shí)間選擇器的方法,參數(shù)方別對(duì)應(yīng):frame耕魄,最小日期画恰,最大日期。

.m文件中先要遵守兩個(gè)協(xié)議:UIPickerViewDelegate與UIPickerViewDataSource吸奴。
接下來(lái)就是大展拳腳了2妗!奄抽!
初始化方法代碼如下:

-(instancetype)initWithFrame:(CGRect)frame WithMinimumDate:(NSDate *)minimumDate maximumDate:(NSDate *)maximumDate{
    if ([super initWithFrame:frame]) {
        self.backgroundColor = [UIColor whiteColor];
        self.yearArray = [NSMutableArray array];
        self.minMonthRemainingArray = [NSMutableArray array];
        self.maxMonthRemainingArray = [NSMutableArray array];
        self.minDayRemainingArray = [NSMutableArray array];
        self.maxDayRemainingArray = [NSMutableArray array];
        NSDate *tenYearsbefore = [NSDate dateWithTimeIntervalSinceNow:(-24 *3600 *365 * 10)];
        NSDate *tenYearsLater = [NSDate dateWithTimeIntervalSinceNow:(24 *3600 *365 * 10)];
        self.minimumDate = minimumDate?minimumDate:tenYearsbefore;//默認(rèn)是10年前
        self.maximumDate = maximumDate?maximumDate:tenYearsLater;//默認(rèn)是10年后
        [self initData];
        [self setViews];
    }
    return self;
}

初始化方法中設(shè)置了默認(rèn)最大時(shí)間最小時(shí)間,這個(gè)可以自行定義甩鳄。使用者調(diào)用初始化方法如果不設(shè)置最大最小時(shí)間的話逞度,就會(huì)自動(dòng)使用默認(rèn)。
代碼就不全貼了妙啃,太多容易惡心到大家西疤。貼一些比較重要的邏輯好了。

/**
 * 返回有多少個(gè)月
 */
- (NSInteger)MonthInSelectYear{
    NSInteger yearRow = [yearPicker selectedRowInComponent:0];
    if ([self.yearArray[yearRow] integerValue] == minYear) {
        return _minMonthRemainingArray.count;
    }else if ([self.yearArray[yearRow] integerValue] == maxYear){
        return _maxMonthRemainingArray.count;
    }else {
        return 12;
    }
}

此方法是返回每年有幾個(gè)月的汉柒,例如最小時(shí)間是2017-7-24杨何,那么2017年就剩下6個(gè)月了。很好理解嘛叠殷!

/**
 * 返回有多少天
 */
- (NSInteger)daysInSelectMonth{
    NSInteger yearRow = [yearPicker selectedRowInComponent:0] % self.yearArray.count;
    NSInteger monthRow = [monthPicker selectedRowInComponent:0] % 12;
    if ([self.yearArray[yearRow] integerValue] == minYear) {
        if ([self.minMonthRemainingArray[monthRow] integerValue] == minMonth) {
            return _minDayRemainingArray.count;
        }else{
            NSInteger monthRemainingDays = [self LeapYearCompare:[self.yearArray[yearRow] integerValue] withMonth:[self.minMonthRemainingArray[monthRow] integerValue]];
            return monthRemainingDays;
        }
    }else if ([self.yearArray[yearRow] integerValue] == maxYear){
        if ([self.maxMonthRemainingArray[monthRow]  integerValue]  == maxMonth){
            return _maxDayRemainingArray.count;
        }else{
            NSInteger monthRemainingDays = [self LeapYearCompare:[self.yearArray[yearRow] integerValue] withMonth:[self.maxMonthRemainingArray[monthRow] integerValue]];
            return monthRemainingDays;
        }
    }else{
        NSInteger monthDays = [self LeapYearCompare:[self.yearArray[yearRow] integerValue] withMonth:monthRow + 1];
        return monthDays;
    }
}

每月返回多少天。不過(guò)多解釋了,自己看吧阿逃!我這種菜13寫的,你一定看得懂赃蛛,看不懂就該轉(zhuǎn)行了恃锉。

#pragma mark - 判斷是否是閏年(返回的的值,天數(shù))
- (NSInteger)LeapYearCompare:(NSInteger)year withMonth:(NSInteger)month{
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
        return [self.leapYearArray[month - 1] integerValue];
    }else{
        return [self.NotLeapYearArray[month - 1] integerValue];
    }
}

閏年就是針對(duì)2月啦。
接下來(lái)就是實(shí)現(xiàn)UIPickerViewDelegate呕臂,UIPickerViewDataSource的方法了
UIPickerViewDataSource:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;

UIPickerViewDelegate:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view;

實(shí)現(xiàn)完了就可以用啦破托,幾句代碼就可以搞定:

NSDate *minimumDate = [NSDate dateWithTimeIntervalSinceNow:(24 * 3600 * 7)];
    NSDate *maximumDate = [NSDate dateWithTimeIntervalSinceNow:(24 *3600 *365 *2)];
    _JDatepicker = [[JXYDatePicker alloc]initWithFrame:CGRectMake(0, 100, SCREEN_WIDTH, datePickerH)WithMinimumDate:minimumDate maximumDate:maximumDate];
    _JDatepicker.delegate = self;
    [self.view addSubview:_JDatepicker];

好啦!隨后附上demo歧蒋。(已上傳) //地址:https://github.com/FengziXiao/JxyDatePicker/tree/master
碼農(nóng)一枚土砂。非常希望得到你的指點(diǎn),如果能夠幫到你谜洽,我也很欣慰萝映!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市褥琐,隨后出現(xiàn)的幾起案子锌俱,更是在濱河造成了極大的恐慌,老刑警劉巖敌呈,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贸宏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡磕洪,警方通過(guò)查閱死者的電腦和手機(jī)吭练,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)析显,“玉大人鲫咽,你說(shuō)我怎么就攤上這事」纫欤” “怎么了分尸?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)歹嘹。 經(jīng)常有香客問(wèn)我箩绍,道長(zhǎng),這世上最難降的妖魔是什么尺上? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任材蛛,我火速辦了婚禮圆到,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卑吭。我一直安慰自己芽淡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布豆赏。 她就那樣靜靜地躺著挣菲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪河绽。 梳的紋絲不亂的頭發(fā)上己单,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音耙饰,去河邊找鬼纹笼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛苟跪,可吹牛的內(nèi)容都是我干的廷痘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼件已,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼笋额!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起篷扩,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兄猩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鉴未,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枢冤,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年铜秆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淹真。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡连茧,死狀恐怖核蘸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啸驯,我是刑警寧澤客扎,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站罚斗,受9級(jí)特大地震影響虐唠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惰聂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一疆偿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搓幌,春花似錦杆故、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拐揭,卻和暖如春撤蟆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堂污。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工家肯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盟猖。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓讨衣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親式镐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子反镇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)娘汞,斷路器歹茶,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 近期虐童事件層出不窮,網(wǎng)絡(luò)上也推薦了很多關(guān)于兒童性教育的繪本你弦。我也馬上買入了推薦的比較多的小雞雞的故事和乳房的故事...
    先行教育羅茜閱讀 726評(píng)論 0 0
  • 拍視頻是為了更好的了解自己動(dòng)作的錯(cuò)誤地方惊豺,以便及時(shí)調(diào)整。 ============================...
    詞窮又詞貧閱讀 274評(píng)論 0 0
  • (20171022周五~20171028周六) 一鳖目、【好習(xí)慣踐行】 1扮叨、晨型人,每天在5:30前起床领迈,這一周早睡開...
    藍(lán)蘭花閱讀 187評(píng)論 0 1