LYSDatePicker 0.0.5

LYSDatePicker 0.0.5

liyangshuai 维护。



  • 李阳帅

LYSDatePicker

当前最高版本:0.0.3

LYSDatePicker 主要用于适应日常开发中需要选择日期的场景。底层主要使用了 UIPickerView 和 UIDatePicker 组件。由于刚刚发布,可能在使用过程中存在一些错误,如发现可反馈,我将尝试修复。

iOS技术群群二维码

使用方法:(目前支持 iOS 8.0 以上)

事实上,我没有在 iOS 8.0 以下进行过测试,自我认为应该没有使用 iOS 8 之前和之后有变动的 API,但是我在集成 Cocoapods 时,选的支持环境是 iOS 8 以上,如果要在 iOS 8 以下使用,可以直接将文件复制到项目中

为了方便大家引入,我加入了 Cocoapods 管理,使用终端 pod search LYSDatePicker

一般情况下,会查到以下内容

-> LYSDatePicker (版本号)
I hope everyone will give me some advice during the process of use. I want to
go further.
pod 'LYSDatePicker', '~> 版本号'
- Homepage: https://github.com/LIYANGSHUAI/LYSDatePicker
- Source:   https://github.com/LIYANGSHUAI/LYSDatePicker.git
- Versions: 版本列表 [master repo]
(END)

直接粘贴:pod 'LYSDatePicker', '~> 版本号'

以下是我考虑到的尽可能多的使用场景,供参考

效果图 效果图 效果图 效果图 效果图 效果图 效果图 效果图 效果图 效果图 效果图 效果图 效果图 效果图 效果图

LYSDatePicker *pickerView = [[LYSDatePicker alloc] initWithFrame:CGRectMake(0, 100, CGRectGetWidth(self.view.frame), 256) type:(LYSDatePickerTypeSystem)];
pickerView.datePickerMode = LYSDatePickerModeTime;
pickerView.date = [NSDate date];
pickerView.headerView.headerBar = self.headerBar;
pickerView.delegate = self;
pickerView.dataSource = self;
[self.view addSubview:pickerView];
LYSDatePicker *pickerView = [[LYSDatePicker alloc] initWithFrame:CGRectMake(0, 100, CGRectGetWidth(self.view.frame), 256) type:(LYSDatePickerTypeCustom)];
pickerView.datePickerMode = LYSDatePickerModeTime;
pickerView.date = [NSDate date];
pickerView.headerView.headerBar = self.headerBar;
pickerView.delegate = self;
pickerView.dataSource = self;
[self.view addSubview:pickerView];
LYSDatePicker *pickerView = [[LYSDatePicker alloc] initWithFrame:CGRectMake(0, 100, CGRectGetWidth(self.view.frame), 256) type:(LYSDatePickerTypeCustom)];
pickerView.datePickerMode = LYSDatePickerModeTime;
pickerView.hourStandard = LYSDatePickerStandard12Hour;
pickerView.date = [NSDate date];

LYSDateHeaderBarItem *cancelItem = [[LYSDateHeaderBarItem alloc] initWithImage:[UIImage imageNamed:@"cancel"] target:self action:@selector(cancelAction:)];
cancelItem.tintColor = [UIColor whiteColor];

LYSDateHeaderBarItem *commitItem = [[LYSDateHeaderBarItem alloc] initWithImage:[UIImage imageNamed:@"fit"] target:self action:@selector(commitAction:)];
commitItem.tintColor = [UIColor whiteColor];

self.headerBar = [[LYSDateHeaderBar alloc] init];
self.headerBar.leftBarItem = cancelItem;
self.headerBar.rightBarItem = commitItem;
self.headerBar.title = @"日期选择器";
self.headerBar.titleColor = [UIColor whiteColor];

pickerView.headerView.headerBar = self.headerBar;
pickerView.delegate = self;
pickerView.dataSource = self;
[self.view addSubview:pickerView];

大致使用方法如上所述,大家可以通过下面的四个枚举值进行不同场景适配

@property (nonatomic, assign) LYSDatePickerType type;
@property (nonatomic, assign) LYSDatePickerMode datePickerMode;
@property (nonatomic, assign) LYSDatePickerWeekDayType weekDayType;
@property (nonatomic, assign) LYSDatePickerStandard hourStandard;

当遇到屏幕宽度不能完全显示组件时,可以实现如下代理

/// Follow the LYSDatePickerViewDelegate protocol to control the layout of higher date selectors
@protocol LYSDatePickerDelegate<NSObject>

@optional
- (CGFloat)datePicker:(LYSDatePicker *)pickerView componentWidthOfIndex:(NSInteger)index;

@end

当然还有另一个方法可以解决不完全显示的问题

@property (nonatomic,strong) UIFont *labelFont;

可以通过设置显示字体大小,间接调整显示范围,因为部分实现源码如下

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
if (self.delegate && [self.delegate respondsToSelector:@selector(datePicker:componentWidthOfIndex:)]) {
return [self.delegate datePicker:self componentWidthOfIndex:component];
}

CGFloat fontSize = self.labelFont.pointSize;

CGFloat year = 50*fontSize/14;
CGFloat month = 35*fontSize/14;
CGFloat hour = 40*fontSize/14;
CGFloat minute = 40*fontSize/14;
CGFloat timeType = 30*fontSize/14;

CGFloat day = 80*fontSize/14;

MatchWeekDayType(None,                                  day = 60*fontSize/14;)
MatchWeekDayType(WeekdaySymbols,                        day = 80*fontSize/14;)
MatchWeekDayType(ShortWeekdaySymbols,                   day = 70*fontSize/14;)
MatchWeekDayType(VeryShortWeekdaySymbols,               day = 60*fontSize/14;)
MatchWeekDayType(Custom,                                day = 80*fontSize/14;)

MatchDatePickerMode(Time,                   {
Match(component == 0,                               {return hour;})
Match(component == 1,                               {return minute;})
Match(component == 2,                               {return timeType;})
})
MatchDatePickerMode(Date,                   {
Match(component == 0,                               {return month;})
Match(component == 1,                               {return day;})
})
MatchDatePickerMode(DateAndTime,            {
Match(component == 0,                               {return month;})
Match(component == 1,                               {return day;})
Match(component == 2,                               {return hour;})
Match(component == 3,                               {return minute;})
Match(component == 4,                               {return timeType;})
})
MatchDatePickerMode(YearAndDate,            {
Match(component == 0,                               {return year;})
Match(component == 1,                               {return month;})
Match(component == 2,                               {return day;})
})
MatchDatePickerMode(YearAndDateAndTime,     {
Match(component == 0,                               {return year;})
Match(component == 1,                               {return month;})
Match(component == 2,                               {return day;})
Match(component == 3,                               {return hour;})
Match(component == 4,                               {return minute;})
Match(component == 5,                               {return timeType;})
})

return 45;
}

我是测试在 iPhone 5s 4.0 手机屏幕下,以14号字体作为参考

2 1