web-dev-qa-db-fra.com

Comment faire en sorte qu'un composant UIPickerView soit bouclé?

Je voudrais montrer un ensemble de nombres consécutifs dans un composant UIPickerView mais le laisser se dérouler comme le composant secondes de l'application Clock-> Timer. Le seul comportement que je peux activer ressemble au composant Heures de l'application Minuterie, dans lequel vous ne pouvez faire défiler que dans un sens.

39
David

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, le pire qui arriver est qu'ils vont frapper 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;
    // ...
}
45
squelart

J'ai trouvé ma réponse ici:

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

Quand il demande le titre d'une ligne, donnez-le: Code:

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

Quand 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 que UIPickerView ne prend pas en charge le wrapping natif, mais vous pouvez le tromper en insérant plus de jeux de données à afficher et, lorsque le sélecteur s’arrête, en centrant le composant au milieu du jeu de données.

21
David

Toutes les réponses ne font pas vraiment défiler cycliquement la vue sélecteur.

J'ai créé une table cyclique basée sur UIScrollView. Et basé sur cette tableView, je re-implémente UIPickerView. Vous pourriez être intéressé par cette DLPickerView. Et cette vue de sélecteur a 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 facile. 

https://github.com/danleechina/DLPickerView

Et sachez que ce DLPickerView défilement cyclique défile réellement. Toute la magie est due à une autre classe DLTableView.

0
Dan Lee

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];
0
user2912794