42 votes

Comment boucler un composant UIPickerView?

Je voudrais montrer un ensemble de nombres consécutifs dans un composant UIPickerView mais le faire boucler comme le composant secondes de l'application Clock-> Timer. Le seul comportement que je peux activer ressemble au composant heures de l'application Timer, où vous pouvez faire défiler dans une seule direction.

48voto

squelart Points 5118

Il est tout aussi facile de définir le nombre de lignes sur un grand nombre et de le faire démarrer à une valeur élevée, il y a peu de chances que l'utilisateur fasse défiler la roue pendant très longtemps - Et même dans ce cas, le pire sera arriver, 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;
    // ...
}
 

23voto

David Points 3254

J'ai trouvé ma réponse ici:

http://forums.macrumors.com/showthread.php?p=6120638&highlight=UIPickerView#post6120638

voici un extrait:

When it asks for the title of a row, give it:
Code:

return [rows objectAtIndex:(row % [rows count])];

When it says the user didSelectRow:inComponent:, use something like this:
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 que la UIPickerView ne prend pas en charge l'habillage autour natif, mais vous pouvez tromper par l'insertion de plusieurs ensembles de données à afficher et lorsque le sélecteur de cesse de, le centrage de la composante à la moyenne de l'ensemble de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X