有起始時間或者截止時間的日期選擇器 iOS

最近公司項目篩選話題里有個日期范圍選擇,考慮到開始時間低于結(jié)束時間,就寫了個有時間范圍的日期選擇器,僅供參考:

選擇時間.jpg

點擊選擇結(jié)束時間 --- 以起始時間作為節(jié)點.jpg

點擊選擇起始時間 --- 以結(jié)束時間作為節(jié)點.jpg

關(guān)于pickerView相關(guān)的代碼

#pragma mark - --- delegate 視圖委托 ---

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 3;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if (component == 0) {
        if (self.beginDate) {
            return 2100 - _year;
        }
        if (self.endDate) {
            return _year + 1 - self.yearMin ;
        }
        return yearSum;
    }else if(component == 1) {
        if (self.beginDate) {//有起始時間的情況下
            NSInteger yearSelected = [pickerView selectedRowInComponent:0] + self.yearMin ;
            if (yearSelected == [NSCalendar currentYear:self.beginDate]) {
                return 13 - [NSCalendar currentMonth:self.beginDate];
            } else {
                return 12;
            }
        }
        if (self.endDate) {//有結(jié)束時間的情況下
            NSInteger yearSelected = [pickerView selectedRowInComponent:0] + self.yearMin ;
            if (yearSelected == [NSCalendar currentYear:self.endDate]) {
                return [NSCalendar currentMonth:self.endDate];
            } else {
                return 12;
            }
        }
        return 12;
    }else {
        if (self.beginDate) {//有起始時間的情況下
            NSInteger yearSelected = [pickerView selectedRowInComponent:0] + self.yearMin ;
            if (yearSelected == [NSCalendar currentYear:self.beginDate]) {
                NSInteger monthSelected = [pickerView selectedRowInComponent:1] + [NSCalendar currentMonth:self.beginDate];
                if ([pickerView selectedRowInComponent:1] == 0) {
                    return [NSCalendar getDaysWithYear:yearSelected month:monthSelected] - [NSCalendar currentDay:self.beginDate] + 1;
                } else {
                    return [NSCalendar getDaysWithYear:yearSelected month:monthSelected];
                }
            } else {
                NSInteger monthSelected = [pickerView selectedRowInComponent:1] + 1;
                return  [NSCalendar getDaysWithYear:yearSelected month:monthSelected];
            }
        }
        if (self.endDate) {//有結(jié)束時間的情況下
            NSInteger yearSelected = [pickerView selectedRowInComponent:0] + self.yearMin ;
            if (yearSelected == [NSCalendar currentYear:self.endDate]) {
                NSInteger monthSelected = [pickerView selectedRowInComponent:1] + 1;
                if (monthSelected == [NSCalendar currentMonth:self.endDate]) {
                    return [NSCalendar currentDay:self.endDate];
                } else {
                    return [NSCalendar getDaysWithYear:yearSelected month:monthSelected];
                }
            } else {
                NSInteger monthSelected = [pickerView selectedRowInComponent:1] + 1;
                return  [NSCalendar getDaysWithYear:yearSelected month:monthSelected];
            }
        }
        NSInteger yearSelected = [pickerView selectedRowInComponent:0] + self.yearMin ;
        NSInteger monthSelected = [pickerView selectedRowInComponent:1] + 1;
        return  [NSCalendar getDaysWithYear:yearSelected month:monthSelected];
    }
}


- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
    return PickerViewLabelWeight;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    switch (component) {
        case 0:
            [pickerView reloadComponent:1];
            [pickerView reloadComponent:2];
            [pickerView selectRow:(12 - [NSCalendar currentMonth:self.beginDate]) inComponent:1 animated:NO];
            [pickerView selectRow:0 inComponent:1 animated:NO];
            [pickerView selectRow:(28 - [NSCalendar currentDay:self.beginDate]) inComponent:2 animated:NO];
            [pickerView selectRow:0 inComponent:2 animated:NO];
            self.year  = [self.pickerView selectedRowInComponent:0] + self.yearMin;
            if (self.beginDate) {
                if (self.year == self.yearMin) {
                    self.month = [NSCalendar currentMonth:self.beginDate];
                    self.day = [NSCalendar currentDay:self.beginDate];
                } else {
                    self.month = 1;
                    self.day = 1;
                }
            } else {
                self.month = 1;
                self.day = 1;
            }
            break;
        case 1:
            [pickerView reloadComponent:2];
            [pickerView selectRow:(28 - [NSCalendar currentDay:self.beginDate]) inComponent:2 animated:NO];
            [pickerView selectRow:0 inComponent:2 animated:NO];
            if (self.beginDate) {
                if (self.year == self.yearMin) {
                    self.month = [self.pickerView selectedRowInComponent:1] + [NSCalendar currentMonth:self.beginDate];
                    if ([self.pickerView selectedRowInComponent:1] == 0) {
                        self.day = [NSCalendar currentDay:self.beginDate];
                    } else {
                        self.day = 1;
                    }
                } else {
                    self.month = [self.pickerView selectedRowInComponent:1] + 1;
                    self.day = 1;
                }
            } else {
                self.month = [self.pickerView selectedRowInComponent:1] + 1;
                self.day = 1;
            }
        default:
            if (self.beginDate) {
                if (self.year == self.yearMin) {
                    if (self.month == [NSCalendar currentMonth:self.beginDate]) {
                        self.day = [self.pickerView selectedRowInComponent:2] + [NSCalendar currentDay:self.beginDate];
                    } else {
                        self.day = [self.pickerView selectedRowInComponent:2] + 1;
                    }
                } else {
                    self.day = [self.pickerView selectedRowInComponent:2] + 1;
                }
            }else {
                self.day = [self.pickerView selectedRowInComponent:2] + 1;
            }
            break;
    }
    
    [self reloadData];
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view
{
    
    NSString *text;
    if (component == 0) {
        if (self.beginDate) {
            text =  [NSString stringWithFormat:@"%zd", row + [NSCalendar currentYear:self.beginDate]];
        } else {
            text =  [NSString stringWithFormat:@"%zd", row + self.yearMin ];
        }
    }else if (component == 1){
        if (self.beginDate) {
            if (self.year == self.yearMin ) {
                text = [NSString stringWithFormat:@"%zd", row + [NSCalendar currentMonth:self.beginDate]];
            } else {
                text = [NSString stringWithFormat:@"%zd", row + 1];
            }
        } else {
            text = [NSString stringWithFormat:@"%zd", row + 1];
        }
    }else{
        if (self.beginDate) {
            if (self.year == self.yearMin ) {
                if (self.month == [NSCalendar currentMonth:self.beginDate]) {
                    text = [NSString stringWithFormat:@"%zd", row + [NSCalendar currentDay:self.beginDate]];
                } else {
                    text = [NSString stringWithFormat:@"%zd", row + 1];
                }
            } else {
                text = [NSString stringWithFormat:@"%zd", row + 1];
            }
        } else {
            text = [NSString stringWithFormat:@"%zd", row + 1];
        }
    }

    UILabel *label = [[UILabel alloc]init];
    [label setTextAlignment:NSTextAlignmentCenter];
    [label setFont:[UIFont systemFontOfSize:17]];
    [label setText:text];
    return label;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秤茅,更是在濱河造成了極大的恐慌懈词,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件结闸,死亡現(xiàn)場離奇詭異唇兑,居然都是意外死亡,警方通過查閱死者的電腦和手機桦锄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門扎附,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人结耀,你說我怎么就攤上這事留夜。” “怎么了饼记?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵香伴,是天一觀的道長。 經(jīng)常有香客問我具则,道長即纲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任博肋,我火速辦了婚禮低斋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匪凡。我一直安慰自己膊畴,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布病游。 她就那樣靜靜地躺著唇跨,像睡著了一般稠通。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上买猖,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天改橘,我揣著相機與錄音,去河邊找鬼玉控。 笑死飞主,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的高诺。 我是一名探鬼主播碌识,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虱而!你這毒婦竟也來了筏餐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤薛窥,失蹤者是張志新(化名)和其女友劉穎胖烛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诅迷,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡佩番,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了罢杉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趟畏。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖滩租,靈堂內(nèi)的尸體忽然破棺而出赋秀,到底是詐尸還是另有隱情,我是刑警寧澤律想,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布猎莲,位于F島的核電站,受9級特大地震影響技即,放射性物質(zhì)發(fā)生泄漏著洼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一而叼、第九天 我趴在偏房一處隱蔽的房頂上張望身笤。 院中可真熱鬧,春花似錦葵陵、人聲如沸液荸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娇钱。三九已至伤柄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間文搂,已是汗流浹背响迂。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留细疚,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓川梅,卻偏偏與公主長得像疯兼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贫途,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,520評論 25 707
  • 難得一身輕松行吧彪, 看看風(fēng)景散散心。 吃好喝好休息好丢早, 沿途不忙發(fā)微信姨裸。
    石三英語閱讀 207評論 0 0
  • 不為輕眸苦思念,上眼彎弦舊夢人怨酝。夜傀缩!思戀的開始夢的終結(jié)。閉眼是你的影农猬,睜眼是一堆的愁赡艰,是說不清的由來已久。 開始遂...
    月流流梭閱讀 162評論 0 0
  • //聯(lián)系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄 一斤葱、獲取系統(tǒng)所支持的國際化信息 //iPhone中...
    石虎132閱讀 382評論 0 6
  • 偶然抬眼間慷垮,看到一樹的驚喜,滿滿的花兒掛在那里揍堕,蓬勃而熱烈料身。
    阿正_fz閱讀 193評論 0 0