您的位置:首页 > 产品设计 > UI/UE

[ios开发技巧之]UIPickerView的数据循环显示

2012-04-07 23:42 453 查看
由于UIPickerView默认并不提供数据的循环显示方法,而我们平时有时候会有需求要求Picker中的数据循环显示,所以我们只能在数据源上面动手脚。

主要需要处理的有以下几个地方:

(转载请保留此文字:本文来源:[ios开发技巧之]UIPickerView的数据循环显示 /article/8615446.html]
,write by Gray.Luo,接受ios/android app 外包开发: guohui.great@gmail.com )

1.UIPickerView的数据源中的行数,我们需要设置一个让用户可以接受的行数 ,也不至于让picker的数据过多而影响拖动效果,比如16384等,让用户看起来是循环显示的效果,当然实际上并不是循环显示,但是这完全可以满足要求:

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
return 16384;
}
2.修改每一行的数据获取的方式,其实就是对我们的数据源数组进行取模而以:

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

//NSLog(@"start : row %d component %d", row, component);
int fontSize = 36;
CGRect rect = CGRectMake(0.0, 0.0, 200, 50);
if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){
rect = CGRectMake(0.0, 0.0, 200, 50);
fontSize = 36;
}else {
rect = CGRectMake(0.0, 0.0, 100, 50);
fontSize = 14;
}

UILabel *myView = [[[UILabel alloc] initWithFrame:rect] autorelease];
myView.textAlignment = UITextAlignmentCenter;
myView.font = [UIFont boldSystemFontOfSize:fontSize];

myView.backgroundColor = [UIColor clearColor];
myView.text = [tmpArray objectAtIndex:row % [tmpArray count]];
// NSLog(@"end:row %d component %d,content:%@", row, component,myView.text );
return myView;
}


3.第三个就是初始化的时候,让每一列都跳到上面的最大行数的中间,让用户感觉数据是循环的。

- (void)viewDidLoad {
[super viewDidLoad];
for (int i = 0; i < 6; i++) {
[pickerView selectRow:16384/2 inComponent:i animated:NO];
}
}


4.最后一点就是取数据,我们还是按上面的数据源的取值方法一样:

- (IBAction)queryButtonHandle{
NSLog(@"weightArray:%d",[pickerView selectedRowInComponent:0]%[weightArray count]);
NSLog(@"colorArray:%d",[pickerView selectedRowInComponent:1]%[colorArray count]);
NSLog(@"cleanLevelArray:%d",[pickerView selectedRowInComponent:2]%[cleanLevelArray count]);
NSLog(@"cutType1Array:%d",[pickerView selectedRowInComponent:3]%[cutType1Array count]);
NSLog(@"cutType2Array:%d",[pickerView selectedRowInComponent:4]%[cutType2Array count]);
NSLog(@"cutType3Array:%d",[pickerView selectedRowInComponent:5]%[cutType3Array count]);
}


通过以上几点就可以给用户呈现一种循环数据的效果,虽然这种方法看上去比较山寨,但是目前也是最简单有效的方法,否则就要去计算每行向上和向下滚动时的情况,然后重新调整数组顺序,然后....反正忒麻烦,要不另一种方法就是自己重写UIPickerView (可以参考http://www.cocoachina.com/bbs/read.php?tid=85374)。

参考:http://www.timespace.org/2008/07/11/the-abusive-pickerview/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: