¿Cómo se reduce un UIPickerView en el iPhone?

Me gustaría reducir la altura de un UIPickerView en mi aplicación de iPhone, para que muestre solo una fila y una columna. La altura de la vista del selector debe ser igual a la altura de una fila.

Estoy utilizando Interface Builder para construir UIPickerView , pero no puedo encontrar una manera fácil de cambiar el tamaño de este control.

¿Cómo se reduce un UIPickerView ?

En realidad, puede reducir ligeramente todo el UIPickerView aplicando una transformación afín a una vista circundante. Por ejemplo:

 CGSize pickerSize = [pickerView sizeThatFits:CGSizeZero]; pickerTransformView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, pickerSize.width, pickerSize.height)]; pickerTransformView.transform = CGAffineTransformMakeScale(0.75f, 0.75f); [pickerTransformView addSubview:pickerView]; [self.view addSubview:pickerTransformView]; [pickerTransformView release]; 

Escalará un selector al 75% de su tamaño original colocándolo dentro de una vista contenedora y aplicando una transformación de escala a esa vista. Aplicar una transformación directamente a UIPickerView conduce a artefactos de dibujo no deseados.

Sin embargo, el tipo de cambio de tamaño que está buscando se resolvería mejor creando un control personalizado.

¡Es posible y fácil!

Simplemente abra el archivo nib como texto sin formato, luego encuentre la vista del selector y ajuste las medidas:

   292 {{85, 68}, {150, 116}} 

¡Eso es todo!

Crea una UIView simple en Interface Builder. Establezca la posición y el tamaño deseados, agregue restricciones. Marque la checkbox “Clip SubViews”. A continuación, arrastre y suelte la Vista del selector dentro de esta vista como una subvista. Agregue restricciones para que el selector se alinee horizontal y verticalmente dentro del contenedor. Debería hacer el trabajo.

La respuesta de user2248258 realmente funciona si usa storyboards y / o autolayout. Ahí me gustaría agregar capturas de pantalla como sugirió Nilambar.

  1. Coloque una vista de selección en otra vista de contenedor con el tamaño que desee Coloque una vista de selección en otra vista de contenedor

  2. revise clipSubviews para la vista de contenedor

  3. alinee el selector centrado horizontal y verticalmente en esa vista de contenedor, también déle cero restricciones para el lugar final y líder

De esta forma, la vista del selector se recorta al tamaño correcto (no se redimensionará).

Resultado: enter image description here

Por lo que yo sé, será un desastre si lo reduces.

a) UITableView+UIPickerView
Te recomiendo que uses la “fila” en UITableView+UIPickerView para hacer esto. Puedes usar una fila en tableView como dropDownList en Windows, cuando tocas en esta fila, se mostrará pickerView (oculto al principio).

b) Si tiene una larga lista de datos en tableView y solo uno de los elementos necesita seleccionar datos, debe desplazarse por la vista utilizando el siguiente método (asegúrese de calcular la posición original de pickerView ya que se moverá hacia arriba / abajo juntos):

 -(void)setViewMove:(BOOL)moveUP offset:(CGFloat)offset { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.3]; CGRect rect = self.view.frame; if(moveUP) { rect.origin.y-=offset; rect.size.height+=offset; } else //move down { rect.origin.y+=offset; rect.size.height-=offset; } self.view.frame = rect; [UIView commitAnimations]; } 

c) También puede agregar otra vista para el selector y volver a esta vista cuando haya seleccionado algo.

Mi conclusión es:
Si tiene pocas líneas en tableView, use a.
Si tiene muchas líneas en tableView pero solo una de ellas necesita selector, use b.
Si tiene muchas líneas en tableView y muchas de ellas necesitan selector, use c.