时间滚动轴的封装
1.TimePickView.h
#import <UIKit/UIKit.h>
@class TimePickView;
@protocol TimePickViewDelegate <NSObject>
- (void)datePickViewConfirm:(TimePickView*)datePickView;
@end;
@interface TimePickView : UIView
@property (weak, nonatomic) id<TimePickViewDelegate> delegate;
@property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
- (IBAction)cancelAction:(id)sender;
- (IBAction)confirmAction:(id)sender;
//获取选中的时间(字符串形式)
- (NSString*)getSelectTime;
//获取选中的时间(中文形式)
- (NSString*)getChinaSelectTime;
- (void)showView:(UIView*)superView;
@end
2.TimePickView.m
#import "TimePickView.h"
#import "Macro.h"
@interface TimePickView()<UIPickerViewDataSource,UIPickerViewDelegate>
{
NSMutableArray *days;
NSMutableArray *hours;
NSMutableArray *minutes;
UIView* bgView;
}
@end
@implementation TimePickView
- (void)awakeFromNib
{
self.backgroundColor = RGB16(COLOR_BG_WHITE);
self.frame = CGRectMake(0, SCREEN_HEIGHT-250, SCREEN_WIDTH, 250);
bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
bgView.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:0.5];
[bgView addSubview:self];
[self initPickViewData];
self.pickerView.delegate = self;
self.pickerView.dataSource = self;
[self setDefaultPickView];
}
- (IBAction)cancelAction:(id)sender {
[self hideView];
}
- (IBAction)confirmAction:(id)sender {
if(self.delegate){
[self.delegate datePickViewConfirm:self];
}
[self hideView];
}
- (void)showView:(UIView*)superView{
self.frame = CGRectMake(0, SCREEN_HEIGHT, SCREEN_WIDTH, 200);
[bgView addSubview:self];
[superView addSubview:bgView];
[UIView animateWithDuration:0.3 animations:^{
self.frame = CGRectMake(0, SCREEN_HEIGHT-250, SCREEN_WIDTH, 230);
}];
}
- (void)hideView{
[UIView animateWithDuration:0.3 animations:^{
self.frame = CGRectMake(0, SCREEN_HEIGHT, SCREEN_WIDTH,200);
} completion:^(BOOL finished) {
[bgView removeFromSuperview];
}];
}
#pragma mark pick view
- (void)initPickViewData{
NSInteger mouthDays =[self getMonthDays];
NSDateComponents * com =[self getNowDateComponents];
days = [[NSMutableArray alloc]init];
for (NSInteger i = [com day]; i<=mouthDays; i++) {
[days addObject:[NSString stringWithFormat:@"%ld月%ld日",[com month],i]];
}
for (NSInteger j =1 ; j<=31-[com day]; j++) {
[days addObject:[NSString stringWithFormat:@"%ld月%ld日",[com month]+1,j]];
}
hours = [[NSMutableArray alloc]init];
for (int i = 0; i<24; i++) {
[hours addObject:[NSString stringWithFormat:@"%d时",i]];
}
minutes = [[NSMutableArray alloc]init];
for (int i = 0; i<60; i++) {
[minutes addObject:[NSString stringWithFormat:@"%d分",i]];
}
}
- (void)setDefaultPickView{
NSDateComponents* comps = [self getNowDateComponents];
NSInteger dayRow = 0;
NSInteger hourRow = [comps hour];
NSInteger minuteRow = [comps minute];
if(60 == minuteRow){
hourRow += 1;
minuteRow = 0;
if(24 == hourRow){
dayRow += 1;
hourRow = 0;
}
}
[self.pickerView selectRow:dayRow inComponent:0 animated:YES];
[self.pickerView selectRow:hourRow inComponent:1 animated:YES];
[self.pickerView selectRow:minuteRow inComponent:2 animated:YES];
self.timeLabel.text = [self getSelectTime];
}
//获取当前月份的天数
- (NSInteger)getMonthDays{
NSCalendar *calendar = [NSCalendar currentCalendar];
NSRange range = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]];
NSUInteger numberOfDaysInMonth = range.length;
return numberOfDaysInMonth;
}
//获取当前时间戳
- (NSDateComponents*)getNowDateComponents{
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate *now = [NSDate date];
NSInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday |
NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSDateComponents *comps = [calendar components:unitFlags fromDate:now];
return comps;
}
#pragma mark --UIPickerViewDataSource,UIPickerViewDelegate
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 3;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
if(0 == component){
return days.count;
}
else if(1 == component){
return hours.count;
}
else{
return minutes.count;
}
}
- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component
{
NSString* title;
if(0 == component){
title = days[row];
}
else if(1 == component){
title = hours[row];
}
else{
title = minutes[row];
}
NSAttributedString *attString = [[NSAttributedString alloc] initWithString:title attributes:@{NSForegroundColorAttributeName:RGB16(COLOR_FONT_BLACK)}];
return attString;
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
[self changePastTimeToDefault];
self.timeLabel.text = [self getChinaSelectTime];
}
- (NSString*)getChinaSelectTime{
//选择时间
NSInteger dayRow = [self.pickerView selectedRowInComponent:0];
NSInteger hourRow = [self.pickerView selectedRowInComponent:1];
NSInteger minuteRow = [self.pickerView selectedRowInComponent:2];
return [NSString stringWithFormat:@"%@%@%@",days[dayRow],hours[hourRow],minutes[minuteRow]];
}
- (NSString*)getSelectTime{
//选择时间
NSInteger dayRow = [self.pickerView selectedRowInComponent:0];
NSInteger hourRow = [self.pickerView selectedRowInComponent:1];
NSInteger minuteRow = [self.pickerView selectedRowInComponent:2];
NSDateComponents* comps = [self getNowDateComponents];
NSInteger secodes = ((dayRow * 24 + hourRow - comps.hour) * 60 + minuteRow- comps.minute) * 60;
NSDate *date = [NSDate dateWithTimeInterval:secodes sinceDate:[NSDate date]];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
return [formatter stringFromDate:date];
}
- (void)changePastTimeToDefault{
NSDateComponents* comps = [self getNowDateComponents];
NSInteger hourCur = [comps hour];
NSInteger minuteCur = [comps minute];
//选择时间
NSInteger dayRow = [self.pickerView selectedRowInComponent:0];
NSInteger hourRow = [self.pickerView selectedRowInComponent:1];
NSInteger minuteRow = [self.pickerView selectedRowInComponent:2];
if (dayRow!=0) {
return;
}else{
if (hourRow>hourCur) {
return;
}else if (hourRow<hourCur){
[self setDefaultPickView];
return;
}else{
if (minuteRow>=minuteCur) {
return;
}else{
[self setDefaultPickView];
return;
}
}
}
}
@end
2.TimePickView.xib