2009-05-25 13 views
23

Me gustaría reducir la altura de UIPickerView en mi aplicación de iPhone, de modo que solo se muestre una fila y una columna. La altura de la vista del selector debe ser igual a la altura de una fila.¿Cómo se encoge un UIPickerView en el iPhone?

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

¿Cómo se reduce un UIPickerView?

+0

Pruebe un UIScrollView y en el didScroll: método del delegado hacen el chasquido si la velocidad de desplazamiento cae por debajo de un umbral. – Dimitris

Respuesta

52

En realidad, puede reducir ligeramente todo el UIPickerView aplicando una transformación afín a una vista adjunta. 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]; 

se escala un selector a 75% de su tamaño original colocándolo dentro de una vista que contiene y aplicar una escala a transformar a esa vista. Aplicar una transformación directamente a UIPickerView conduce a artefactos de dibujo no deseados.

Sin embargo, el tipo de redimensionamiento que está buscando sería mejor si crea un control personalizado.

+5

+1 ¡Nunca * * he pensado en aplicar la transformación a la supervista! Siempre he tratado de aplicarlo a la vista de selección con resultados insatisfactorios. Yo hubiera votado 10 veces si pudiera. –

+0

Estoy perdiendo la capacidad de enviar eventos táctiles al PickerView después de rotarlo. ¿Pensamientos? – Mark

+1

@mark - ¿Estás seguro de que el selector y su vista circundante están todavía dentro de los límites de su vista contenedora? Si se encuentran fuera de la supervista, los eventos táctiles no llegarán a ellos. –

1

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

a) UITableView + UIPickerView
Le recomiendo que utilice la "fila en UITableView + UIPickerView" para hacer esto. Puede usar una fila en tableView como dropDownList en Windows, cuando toque 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 para recoger datos, debe desplazarse por la vista utilizando el siguiente método (asegúrese de calcular la posición original de pickerView como lo hará) 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 añadir otro punto de vista para el recogedor y volver a este punto de vista cuando se ha seleccionado algo.

Mi conclusión es:
Si tiene pocas líneas en tableView, utilice 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.

+0

¿Existe alguna manera de crear un selector desplegable como el que vemos en las páginas web –

+0

? En las páginas web, la lista desplegable fue creada originalmente por otras herramientas en la plataforma Windows. Safari agrega un control único para ver dropDownList, pero Apple no lo agrega a xcode. –

3

¡Es posible y fácil!

Sólo tiene que abrir el archivo semilla como texto sin formato, y luego encontrar la vista selector y ajustar las medidas:

<object class="IBUIPickerView" id="783900772"> 
<reference key="NSNextResponder" ref="191373211"/> 
<int key="NSvFlags">292</int> 
<string key="NSFrame">{{85, 68}, {150, 116}}</string> 

Eso es todo!

+0

Cuando agrego el texto en negrita que escribe aquí, no pasa nada. Así que modifiqué el siguiente elemento -> NSFrameSize a {320, 116} (originalmente 320, 216). Y esto funciona –

+0

Recomiendo configurar "NSFrameSize" en {320, 130} ya que esto mostrará las 3 líneas superiores, incluido el indicador del selector. Pero el lado effict es que esto no mostrará el fotograma inferior del selector y los usuarios no podrán ver nada más que las 3 líneas superiores. –

+1

Esto no está cambiando nada para mí. – Bryan

1

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

+0

Algún ejemplo con explicación sería genial. – Nilambar

+0

Desafortunadamente, la "reputación" de mi cuenta de Stackoverflow no me permite subir las imágenes. Puedo enviarte detalles si lo deseas. – user2248258

1

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

  1. lugar un pickerview en otra vista recipiente con el tamaño que usted lo quiere Place a pickerview into another container view

  2. clipSubviews de verificación de la vista contenedora

  3. alinear el selector de centrado horizontal y verticalmente en esa vista contenedor, también le da 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

+0

Esta es una gran sugerencia, se adapta bien a lo que busqué o. –

Cuestiones relacionadas