自定义时间选择器UIPickerView


使用方法:

@property (nonatomic, assign) QLChangeTimeView *chooseTimeView;

//时间选择视图

_chooseTimeView = [[NSBundle mainBundle]loadNibNamed:@"QLChangeTimeView" owner:self options:nil].lastObject;

_chooseTimeView.frame = CGRectMake( 时间选择器的大小);

_chooseTimeView.titleArr = @[@"今天",@"明天"];

//当前时间

NSDate *date = [NSDate date];

_chooseTimeView.nowDate = date;

_chooseTimeView.mintInterval = 10;

_chooseTimeView.leadTime = 20;

_chooseTimeView.block = ^(NSString *time) {

//time返回选择的时间

};

//时间选择视图确认按钮

[_chooseTimeView.yesBtn addTarget:self action:@selector(yesBtnClick) forControlEvents:UIControlEventTouchUpInside];

//时间选择视图取消按钮

[_chooseTimeView.noBtn addTarget:self action:@selector(noBtnClick) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:_chooseTimeView];


QLChangeTimeView内容:

#import "QLChangeTimeView.h"

@interface QLChangeTimeView()

@property (nonatomic, strong) NSMutableDictionary *dataDic;

@property (nonatomic, strong) NSDictionary *dic;

@property (nonatomic, strong) NSMutableDictionary *HHDic;

@property (nonatomic, strong) NSMutableDictionary *bHHDic;

@property (nonatomic, strong) NSMutableArray *MMArr;

@property (nonatomic, strong) NSMutableArray *mmArr;

@property (nonatomic, strong) NSString *aStr;

@property (nonatomic, strong) NSString *bStr;

@property (nonatomic, strong) NSString *cStr;

@end

@implementation QLChangeTimeView

- (NSDictionary*)dataDic {    

if (!_dataDic) {    

    _dataDic = [NSMutableDictionary dictionary];   

 }    

return _dataDic;

}

- (NSDictionary*)dic {    

if (!_dic) {        

_dic = [NSDictionary dictionary];   

 }    

return _dic;}

-(NSMutableArray *)MMArr {  

  if (!_MMArr) {       

 _MMArr = [NSMutableArray array];            

}   

 return _MMArr;}

-(NSMutableArray *)mmArr {   

 if (!_mmArr) {        

_mmArr = [NSMutableArray array];   

 }   

 return _mmArr;

}

- (void)awakeFromNib {   

 [super awakeFromNib];     

self.pickerView.delegate = self;    

self.pickerView.dataSource = self;        

[self addObserver:self forKeyPath:@"nowDate" options:NSKeyValueObservingOptionNew context:nil];

}

- (IBAction)noBtnClick:(id)sender {      

      }

- (IBAction)yesBtnClick:(id)sender {     

   _result = [NSString stringWithFormat:@"%@ %@:%@",_aStr,_bStr,_cStr];          MYLog(@"%@",_result);   

 _block(_result);  

  _aStr = nil;    

_bStr = nil;    

_cStr = nil;

}

#pragma mark -- UIPickerView

//1.有几列

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {

_dic = _dataDic[@"0"];

NSArray *arr = _dic.allKeys;

NSArray *result = [arr sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {

return [obj1 compare:obj2]; //升序

}];

_MMArr = [result copy];

NSString *name = _MMArr[0];

_mmArr = _dic[name];

return 3;

}

//2.每一列有几行

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {

switch (component) {

case 0:

return _titleArr.count;

case 1:{

return _MMArr.count;

}

default:{

return _mmArr.count;

}

}

}

//3.每一列显示什么内容

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view

{

UILabel *lblDate = [[UILabel alloc] init];

[lblDate setFont:[UIFont systemFontOfSize:16.0]];

[lblDate setTextColor:[UIColor blackColor]];

[lblDate setBackgroundColor:[UIColor clearColor]];

[lblDate setTextAlignment:NSTextAlignmentCenter];

if (component == 0) {

[lblDate setText:_titleArr[row]];

} else if (component == 1) {

[lblDate setText:[NSString stringWithFormat:@"%@点",_MMArr[row]]];

} else {

[lblDate setText:[NSString stringWithFormat:@"%@分",_mmArr[row]]];

}

return lblDate;

}

//选中

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

if (component == 0) {

_dic = _dataDic[[NSString stringWithFormat:@"%ld",(long)row]];

NSArray *arr = _dic.allKeys;

NSArray *result = [arr sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {

return [obj1 compare:obj2]; //升序

}];

_MMArr = [result copy];

NSString *name = _MMArr[row];

_mmArr = _dic[name];

[self.pickerView reloadComponent:1];

[self.pickerView reloadComponent:2];

[self.pickerView selectRow:0 inComponent:1 animated:YES];

[self.pickerView selectRow:0 inComponent:2 animated:YES];

_aStr = [NSString stringWithFormat:@"%@",_titleArr[row]];

_bStr = [NSString stringWithFormat:@"%02d",[_MMArr[0] intValue]];

_cStr = [NSString stringWithFormat:@"%02d",[_mmArr[0] intValue]];

} else if (component == 1) {

NSString *name = _MMArr[row];

_mmArr = _dic[name];

[self.pickerView reloadComponent:2];

_bStr = [NSString stringWithFormat:@"%02d",[_MMArr[row] intValue]];

_cStr = [NSString stringWithFormat:@"%02d",[_mmArr[0] intValue]];

[self.pickerView selectRow:0 inComponent:2 animated:YES];

} else {

_cStr = [NSString stringWithFormat:@"%02d",[_mmArr[row] intValue]];

}

}

//高度

-(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{   

 return 40;

}

//监听

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context {

if ([keyPath isEqualToString:@"nowDate"]) {

NSDate *date = [change objectForKey:NSKeyValueChangeNewKey];

NSDate *testDate = [NSDate dateWithTimeInterval:60*_leadTime sinceDate:date];

NSDateFormatter *df = [[NSDateFormatter alloc]init];

df.dateFormat = @"YYYY-MM-dd HH mm";

[df setLocale:[NSLocale currentLocale]];

NSString *dateStr = [df stringFromDate:testDate];

[self changeTimeWay:dateStr];

[self.pickerView reloadAllComponents];

[self.pickerView selectRow:0 inComponent:0 animated:YES];

[self.pickerView selectRow:0 inComponent:1 animated:YES];

[self.pickerView selectRow:0 inComponent:2 animated:YES];

}

}

- (void)changeTimeWay:(NSString *)dateStr {

NSMutableDictionary *bHHDic = [NSMutableDictionary dictionary];

NSMutableDictionary *HHDic = [NSMutableDictionary dictionary];

NSMutableArray *mmArr = [NSMutableArray array];

NSMutableArray *MMArr = [NSMutableArray array];

NSArray *dateArr = [dateStr componentsSeparatedByString:@" "];

_aStr = _aStr.length == 0?@"今天" : _aStr;

_bStr = _bStr.length == 0?[NSString stringWithFormat:@"%02d",[dateArr[1] intValue]] : _bStr;

_cStr = _cStr.length == 0?[NSString stringWithFormat:@"%02d",[dateArr[2] intValue]-[dateArr[2] intValue]%10] : _cStr;

for (int j = [dateArr[2] intValue]-[dateArr[2] intValue]%10; j < 60; j = j+_mintInterval) {

[MMArr addObject:[NSString stringWithFormat:@"%d",j]];

}

for (int j = 0; j < 60; j = j+_mintInterval) {

[mmArr addObject:[NSString stringWithFormat:@"%d",j]];

}

for (int i = [dateArr[1] intValue]; i < 24; i++) {

if (i == [dateArr[1] intValue]) {

[HHDic setObject:MMArr forKey:[NSString stringWithFormat:@"%02d",[dateArr[1] intValue]]];

} else {

[HHDic setObject:mmArr forKey:[NSString stringWithFormat:@"%02d",i]];

}

}

for (int i = 0; i < 24; i++) {

[bHHDic setValue:mmArr forKey:[NSString stringWithFormat:@"%02d",i]];

}

_dataDic = [NSMutableDictionary dictionaryWithCapacity:_titleArr.count];

for (int i = 0; i < _titleArr.count; i++) {

if (i == 0) {

[_dataDic setValue:HHDic forKey:[NSString stringWithFormat:@"%d",i]];

} else {

[_dataDic setValue:bHHDic forKey:[NSString stringWithFormat:@"%d",i]];

}

}

}

- (void)dealloc {

[self removeObserver:self forKeyPath:@"nowDate"];

}

@end

QLChangeTimeView下载地址:https://pan.baidu.com/s/1i4Aq7NR

自定义一个 UIPickerView,你需要遵循 UIPickerViewDataSource 和 UIPickerViewDelegate 协议,并实现其中的方法。 首先,你需要创建一个 UIPickerView 实例,并设置其数据源和代理为当前视图控制器。 ```swift class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { let pickerView = UIPickerView() override func viewDidLoad() { super.viewDidLoad() pickerView.dataSource = self pickerView.delegate = self view.addSubview(pickerView) } } ``` 接着,你需要实现 UIPickerViewDataSource 协议中的两个必须方法:numberOfComponents(in:) 和 numberOfRows(inComponent:)。前者用于返回选择器中的列数,后者用于返回每列中的行数。 ```swift func numberOfComponents(in pickerView: UIPickerView) -> Int { return 2 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return 10 } ``` 这里我们设置了两列,每列都有 10 行。 然后,你需要实现 UIPickerViewDelegate 协议中的方法来自定义选择器的样式和行为。比如,你可以自定义每一行的标题和宽度,以及选择器的动画效果。 ```swift func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return "Row \(row)" } func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat { return 100 } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { print("Selected row \(row) in component \(component)") } ``` 这里我们简单地返回了每一行的标题为 "Row \(row)",每列的宽度为 100,当选择器的行被选中时,会在控制台输出相应的信息。 最后,你需要将 UIPickerView 添加到你的视图中,并设置它的位置和大小。 ```swift pickerView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 200) ``` 这里我们将选择器的宽度设置为与视图宽度相同,高度为 200,然后将其添加到视图的顶部。 这样,你就可以自定义一个 UIPickerView 了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值