Domanda

Vorrei mostrare una serie di numeri consecutivi in ??un componente UIPickerView ma farlo scorrere come il componente secondi dell'applicazione Orologio- > Timer. L'unico comportamento che posso abilitare è simile al componente ore dell'applicazione Timer, in cui puoi scorrere in una sola direzione.

È stato utile?

Soluzione

È altrettanto facile impostare il numero di righe su un numero elevato e farlo iniziare con un valore elevato, ci sono poche possibilità che l'utente possa mai far scorrere la ruota per un tempo molto lungo - E anche allora, il peggio che accadrà è che colpiranno il fondo.

- (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;
    // ...
}

Altri suggerimenti

Ho trovato la mia risposta qui:

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

Quando chiede il titolo di una riga, dagli: Codice:

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

Quando dice l'utente didSelectRow: inComponent :, usa qualcosa del genere:

Codice:

//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];
}

Sembra che UIPickerView non supporti il ??wrapping in modo nativo, ma puoi ingannarlo inserendo più set di dati da visualizzare e quando il selettore si arresta, centrando il componente al centro del set di dati.

Basta creare un array più volte, in modo da avere i numeri più volte. Diciamo quando si desidera avere i numeri da 0 a 23 e inserirli in un array. che faremo 10 volte in questo modo ...

NSString *stdStepper;

    for (int j = 0; j<10; j++) {
        for(int i=0; i<24; i++)
        {
            stdStepper = [NSString stringWithFormat:@"%d", i];

            [_hoursArray addObject:stdStepper];

        }
    }

più tardi impostiamo la riga 0 selezionata in questo modo

[_hoursPickerView selectRow:120 inComponent:0 animated:NO];

Tutte le risposte non fanno davvero scorrere ciclicamente la vista del selettore.

Ho creato un tableView ciclico basato su UIScrollView . E sulla base di questo tableView, implemento nuovamente UIPickerView . Potresti essere interessato a questo DLPickerView . E questa vista di selezione ha tutte le funzionalità di UIPickerView , ma offre anche molte nuove funzionalità e personalizzare questa vista di selezione è molto più semplice.

https://github.com/danleechina/DLPickerView

E tieni presente che questo DLPickerView scorre ciclicamente in modo ciclico. Tutta la magia è avvenuta a causa di un'altra classe DLTableView .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top