2008-10-18 9 views
38

Me gustaría mostrar un conjunto de números consecutivos en un componente UIPickerView pero tenerlo envuelto como el componente de segundos de la aplicación Reloj-> Temporizador. El único comportamiento que puedo habilitar se parece al componente horas de la aplicación Timer, donde puede desplazarse solo en una dirección.¿Cómo se hace que un componente UIPickerView se ajuste?

Respuesta

44

Es tan fácil establecer el número de filas en un número grande, y hacer que comience con un valor alto, hay pocas posibilidades de que el usuario pueda desplazar la rueda por un tiempo muy largo - Y aun así, lo peor que sucederá es que van a tocar 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; 
    // ... 
} 
+0

¡Esto funcionó bien para mí! Gracias. ¿Existe algún problema de rendimiento/memoria? – Dimitris

+0

No debería haber problemas de rendimiento/memoria en comparación con una lista que no se ajusta, ya que el marco no mantiene los elementos desplazados en la memoria. Si no está seguro, ¡use el generador de perfiles! – squelart

+1

Así es como la aplicación Clock implementa 'looping'.NSIntegerMax –

20

encontré mi respuesta aquí:

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

Cuando se le pregunta por el título de una fila, darle: Código:

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

Cuando se dice que el didSelectRow usuario: inComponent :, usar algo como esto:

Código:

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

Parece que UIPickerView no admite envolverse de forma nativa, pero puede engañar insertando más conjuntos de datos para mostrar y cuando el selector se detiene, centrando el componente en el medio del conjunto de datos.

+0

awesome !! gracias una tonelada !! La buena solución fue realmente útil – user1046037

0

Simplemente cree una matriz varias veces, para que tenga sus números varias veces. Digamos cuando queremos tener los números del 0 al 23 y ponerlos en una matriz. que vamos a hacer 10 momentos como este ...

NSString *stdStepper; 

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

      [_hoursArray addObject:stdStepper]; 

     } 
    } 

más adelante nos propusimos la fila 0 seleccionadas como esto

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

Todas las respuestas no están realmente haciendo la vista selector de desplazamiento de forma cíclica.

He hecho un tableView cíclico basado en UIScrollView. Y basado en este tableView, reimpleto UIPickerView. Usted podría estar interesado en este DLPickerView. Y esta vista de selector tiene todas las características que tiene UIPickerView, pero también ofrece muchas características nuevas, y esta vista personalizada es mucho más fácil.

https://github.com/danleechina/DLPickerView

Y ser conscientes de que este desplazamiento DLPickerView cíclicamente es realmente desplaza cíclicamente. Toda la magia sucedió debido a otra clase DLTableView.

Cuestiones relacionadas