image.png
image.png
UIPickerView和UITableView用法很相似 下面用一个简单的年月日做为demo
- 核心api
- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated;
- (NSInteger)selectedRowInComponent:(NSInteger)component;
基础代码
属性
@property(nonatomic,strong)UIPickerView *mainView;
代理
<UIPickerViewDelegate,UIPickerViewDataSource>
懒加载
- (UIPickerView *)mainView
{
if (!_mainView) {
UIPickerView *view = [[UIPickerView alloc]initWithFrame:CGRectMake(0, 0, WIDTH, 200*ADAPTER_WIDTH)];
view.delegate = self;
view.dataSource = self;
view.showsSelectionIndicator = YES;
view.backgroundColor = WhiteColor;
[self.view addSubview:view];
_mainView = view;
}
return _mainView;
}
代理方法
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 3;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return 10;
}
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
return 44*ADAPTER_WIDTH;
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
if (view == nil) {
UILabel *lab = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, WIDTH - 100*ADAPTER_WIDTH, 44)];
lab.font = [UIFont systemFontOfSize:15*ADAPTER_WIDTH weight:UIFontWeightRegular];
lab.textColor = [UIColor blackColor];
lab.textAlignment = NSTextAlignmentCenter;
view = lab;
}
UILabel *lab = (UILabel *)view;
lab.text = @"haha";
return lab;
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
//xxxxx核心滑动逻辑判断
}
业务代码(具体情况具体写)
//数据 包括年 月 日
@property(nonatomic,strong)NSMutableArray<NSMutableArray<NSString *> *> *dataSource;
@property(nonatomic,strong)NSMutableArray<NSString *> *years;
@property(nonatomic,strong)NSMutableArray<NSString *> *months;
@property(nonatomic,strong)NSMutableArray<NSString *> *days;//变化比较大 根据闰年 月份判断普通月份和2月份
//当前的年月日
@property(nonatomic,strong)NSString *year;
@property(nonatomic,strong)NSString *month;
@property(nonatomic,strong)NSString *day;
//现在的年月日
@property(nonatomic,strong)NSString *currentYear;
@property(nonatomic,strong)NSString *currentMonth;
@property(nonatomic,strong)NSString *currentDay;
- (NSMutableArray<NSString *> *)years
{
if (!_years) {
_years = [NSMutableArray array];
for (NSInteger index = 2014; index <= self.currentYear.integerValue; index ++) {
[_years addObject:[NSString stringWithFormat:@"%ld",index]];
}
}
return _years;
}
- (NSMutableArray<NSString *> *)months
{
_months = [NSMutableArray array];
for (NSInteger index = 1; index <= 12; index ++) {
[_months addObject:[NSString stringWithFormat:@"%ld",index]];
}
//判断是否是当年
if (self.year == self.currentYear) {
[_months removeAllObjects];
for (NSInteger index = 1; index <= self.currentMonth.integerValue; index ++) {
[_months addObject:[NSString stringWithFormat:@"%ld",index]];
}
}
return _months;
}
- (NSMutableArray<NSString *> *)days
{
NSMutableArray<NSNumber *> *months = [NSMutableArray array];
[months addObjectsFromArray:@[@31,@28,@31,@30,@31,@30,@31,@31,@30,@31,@30,@31]];
//判断2月
NSInteger year = self.year.integerValue;
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
[months replaceObjectAtIndex:1 withObject:@29];
}
//获取天数
NSInteger dayNum = months[(self.month.integerValue - 1)].integerValue;
NSMutableArray *day = [NSMutableArray array];
for (NSInteger index = 1; index <= dayNum; index ++) {
[day addObject:[NSString stringWithFormat:@"%ld",index]];
}
//判断是否是当年当月 那么就返回当天的过去的
if (self.year == self.currentYear && self.month == self.currentMonth) {
[day removeAllObjects];
for (NSInteger index = 1; index <= self.currentDay.integerValue; index ++) {
[day addObject:[NSString stringWithFormat:@"%ld",index]];
}
}
return day;
}
- (void)createDataSource
{
NSDate *date = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"YYYY-MM-dd"];
NSString *currentTime = [formatter stringFromDate:date];
NSArray<NSString *> *timeArrs = [currentTime componentsSeparatedByString:@"-"];
self.year = timeArrs[0];
self.month = [NSString stringWithFormat:@"%ld",timeArrs[1].integerValue];
self.day = [NSString stringWithFormat:@"%ld",timeArrs[2].integerValue];
self.currentYear = self.year;
self.currentMonth = self.month;
self.currentDay = self.day;
[self.dataSource addObject:self.years];
[self.dataSource addObject:self.months];
[self.dataSource addObject:self.days];
[self.mainView reloadAllComponents];
dispatch_async(dispatch_get_main_queue(), ^{
[self.mainView selectRow:[self.years indexOfObject:self.currentYear] inComponent:0 animated:YES];
[self.mainView selectRow:[self.months indexOfObject:self.currentMonth] inComponent:1 animated:YES];
[self.mainView selectRow:[self.days indexOfObject:self.currentDay] inComponent:2 animated:YES];
});
}
因为我这个业务是不能超过当前年月日所有 月和日的数组是动态的获取
滑动核心
- 滑动年
滑动年 停止后要刷新月 月如果是超出范围限制内 需要刷新日
if (component == 0) {
xxxxxx
} else if (component == 1) {
} else {
}
//获取当前年
self.year = self.dataSource[component][row];
//替换月的数据
[self.dataSource replaceObjectAtIndex:1 withObject:self.months];
//UI刷新 --- 因为有的年份月可能有限制比如当年不超过本月(如现在2020年5月 那么2020年月份就是1 2 3 4 5 不能超过5)
[pickerView reloadComponent:1];
//月刷新后 看日
dispatch_async(dispatch_get_main_queue(), ^{
//获取当前月
self.month = self.dataSource[1][[pickerView selectedRowInComponent:1]];
//获取当前月有多少日
[self.dataSource replaceObjectAtIndex:2 withObject:self.days];
//UI --- 刷新日
[pickerView reloadComponent:2];
//刷新完日 界面停止 这个时候才能真正获取到当前pickerView上的数据
dispatch_async(dispatch_get_main_queue(), ^{
//联动后
self.day = self.dataSource[2][[pickerView selectedRowInComponent:2]];
//显示UI
//xxxxxx
});
});
核心
dispatch_async(dispatch_get_main_queue(), ^{
dispatch_async(dispatch_get_main_queue(), ^{
dispatch_async(dispatch_get_main_queue(), ^{
});
});
});
- 滑动月
- 滑动日
网友评论