Come si fa a avvolgere un componente UIPickerView?
-
03-07-2019 - |
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.
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:
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
.