Comment faire en sorte qu'un composant UIPickerView soit bouclé?
-
03-07-2019 - |
Question
Je voudrais afficher un ensemble de nombres consécutifs dans un composant UIPickerView, mais le placer comme un composant identique à celui de la composante secondes de l'application Clock - > Timer. Le seul comportement que je peux activer ressemble au composant Heures de l'application Minuteur, dans lequel vous ne pouvez faire défiler que dans un sens.
La solution
Il est tout aussi facile de définir un nombre élevé de lignes et de le faire démarrer à une valeur élevée. Il y a donc peu de chances que l'utilisateur fasse défiler la molette pendant très longtemps - et même dans ce cas, la Le pire, c’est qu’ils vont toucher le fond.
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
// Near-infinite number of rows.
return NSIntegerMax;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
// Row n is same as row (n modulo numberItems).
return [NSString stringWithFormat:@"%d", row % numberItems];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.pickerView = [[[UIPickerView alloc] initWithFrame:CGRectZero] autorelease];
// ...set pickerView properties... Look at Apple's UICatalog sample code for a good example.
// Set current row to a large value (adjusted to current value if needed).
[pickerView selectRow:currentValue+100000 inComponent:0 animated:NO];
[self.view addSubview:pickerView];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
NSInteger actualRow = row % numberItems;
// ...
}
Autres conseils
J'ai trouvé ma réponse ici:
Quand il demande le titre d'une ligne, donnez-le: Code:
return [rows objectAtIndex:(row % [rows count])];
Lorsqu'il est indiqué que l'utilisateur didSelectRow: inComponent:, utilise quelque chose comme ceci:
Code:
//we want the selection to always be in the SECOND set (so that it looks like it has stuff before and after)
if (row < [rows count] || row >= (2 * [rows count]) ) {
row = row % [rows count];
row += [rows count];
[pickerView selectRow:row inComponent:component animated:NO];
}
Il semble qu'UIPickerView ne prenne pas en charge le wrapping natif, mais vous pouvez le tromper en insérant davantage de jeux de données à afficher. Lorsque le sélecteur s'arrête, centrez le composant au milieu du jeu de données.
Créez simplement un tableau plusieurs fois, de manière à avoir vos numéros plusieurs fois. Disons quand vouloir avoir les nombres de 0 à 23 et les mettre dans un tableau. que nous ferons 10 fois comme ça ...
NSString *stdStepper;
for (int j = 0; j<10; j++) {
for(int i=0; i<24; i++)
{
stdStepper = [NSString stringWithFormat:@"%d", i];
[_hoursArray addObject:stdStepper];
}
}
plus tard, nous définissons la ligne 0 sélectionnée comme ceci
[_hoursPickerView selectRow:120 inComponent:0 animated:NO];
Toutes les réponses ne font pas vraiment défiler cycliquement la vue sélecteur.
J'ai créé une tableView cyclique basée sur UIScrollView
. Et sur la base de cette table, je réimplémente UIPickerView
. Vous pourriez être intéressé par ce DLPickerView
. Et cette vue de sélecteur contient toutes les fonctionnalités de UIPickerView
, mais offre également de nombreuses nouvelles fonctionnalités, et la personnalisation de cette vue de sélecteur est beaucoup plus simple.
https://github.com/danleechina/DLPickerView
Et sachez que le défilement cyclique de DLPickerView
défile réellement. Toute la magie est due à une autre classe DLTableView
.