Je ne pense pas que son possible de faire vraiment circulaire, mais vous pouvez truquer.
#define kRowsInPicker 10000
- (void)viewDidLoad {
NSArray *localPickerData = [[NSArray alloc] initWithObjects:
@"Ottawa", @"Toronto", @"Montreal", @"Winnipeg",
@"Saskatchewan", @"Iqaluit", @"Edomonton", nil];
[self setPickerData:localPickerData];
[localPickerData release];
UIPickerView *localPicker = [[UIPickerView alloc] initWithFrame:
CGRectMake(0, 0, 320, 216)];
[localPicker setDelegate:self];
[localPicker setDataSource:self];
localPicker.showsSelectionIndicator = YES;
NSInteger selectedRow = 0;
[localPicker selectRow:(((NSInteger)((kRowsInPicker/2)/[pickerData count])) * [pickerData count]) + (selectedRow%[pickerData count]) inComponent:0 animated:NO];
[self setPicker:localPicker];
[localPicker release];
[[self view] addSubview:picker];
[super viewDidLoad];
}
#pragma mark -
#pragma mark UIPickerViewDataSource methods
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
// usually "return [pickerData count];"
return kRowsInPicker; // 10,000 is good, if you add a few more zeros
// there seems to be problems.
}
#pragma mark -
#pragma mark UIPickerViewDelegate methods
- (NSString *)pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [pickerData objectAtIndex:row%[pickerData count]];
}
Vous pouvez modifier le nombre de chaînes dans pickerData et cela fonctionnera toujours correctement. La ligne sélectionnée sélectionne la "première" valeur la plus proche du milieu. row% [pickerData count] renvoie les éléments suivants en supposant qu'il y ait 3 NSStrings dans pickerData:
ROW RETURNS
0 0
1 1
2 2
3 0
4 1
5 2
6 0
7 1
8 2
etc...
Il va juste parcourir 0 à travers la longueur du tableau. Le truc confus dans viewDidLoad choisit juste une valeur aussi proche du milieu que possible en utilisant l'index de l'élément du tableau que vous fournissez dans
selectedItem. Il n'y a pas de perte de performance ou de fuite de mémoire, tout ce que vous avez alloué est le seul tableau. Chaque fois que vous accédez à leur choix, utilisez ([localPicker selectedRowInComponent: 0]% [pickerData count]). S'il y a quelque chose que vous ne comprenez pas ou quelque chose que j'ai manqué, veuillez commenter. J'espère que cela a aidé!
Vous voulez le rendre circulaire? J'essaie de trouver une réponse, revenez plus tard peut-être que je l'aurai compris. – mk12
Voir http://stackoverflow.com/questions/214441/how-do-you-make-an-uipickerview-component-wrap-around – squelart