iphone cocoa-touch landscape

iphone - UIPicker dimensionando en modo horizontal



cocoa-touch landscape (7)

Estoy bastante seguro de que el UIPicker viene en un tamaño que no puedes cambiar. Estaría interesado en escuchar diferente.

Estoy tratando de desarrollar una aplicación con un UIPicker en modo horizontal, ocupando (casi) todo el ancho de la pantalla (con 5 o 6 componentes). ¿Puedes decirme cómo configurar el tamaño de UIPicker? Muchas gracias por su ayuda.


Puede editar el tamaño abriendo el archivo .xib en TextEdit y cambiando el tamaño de UIPickerView.


La respuesta está en:

-(UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {

Como con:

- (NSString*)pickerView:(UIPickerView*)pv titleForRow:(NSInteger)row forComponent:(NSInteger)component

Lo hace funcionar (es decir: de lado con etiqueta escalada) por supuesto


No puedes. El tamaño de UIPickerView es constante.

ACTUALIZACIÓN: resulta que puede cambiar el tamaño de un UIPickerView. El truco es colocarlo dentro de otra UIView (más pequeña) y cambiar el tamaño de esa vista. No he intentado esto todavía.

ACTUALIZACIÓN 2: Este método no cambia el tamaño del UIPickerView, sino que lo recorta. Puede ser o no lo que estás buscando, pero AFAIK, no hay manera de cambiar el tamaño de UIPickerView, y esto es lo más parecido posible. No se ve tan mal.

ACTUALIZACIÓN 3 ( Fecha de vencimiento): A partir de SDK 3.0, UIPickerView puede redimensionarse completamente utilizando initWithFrame o setFrame.


En realidad, cambio el tamaño de mis selectores para casi todas las aplicaciones. No me gusta que ocupen toda la pantalla. Este es el método que estoy usando: (tenga en cuenta que también estoy rotando el selector para que sea horizontal)

en viewDidLoad .....

picker = [[UIPickerView alloc] initWithFrame:CGRectZero]; picker.delegate = self; picker.dataSource = self; picker.showsSelectionIndicator = NO; //Resize the picker, rotate it so that it is horizontal and set its position CGAffineTransform rotate = CGAffineTransformMakeRotation(-1.57); rotate = CGAffineTransformScale(rotate, .46, 2.25); CGAffineTransform t0 = CGAffineTransformMakeTranslation(3, 22.5); picker.transform = CGAffineTransformConcat(rotate,t0); [self.view addSubview:picker]; [picker release];

Luego, me gusta agregar una imagen de fondo para mi vista que cubre las barras grises (que ahora están en la parte superior e inferior) del UIPicker:

//Create the overlay to superimpose ontop of the picker //In this case, the image is the size of the screen with a transparent area the size of the //UIPickerView cut out in the middle UIImageView *uiiv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"problem_bg.png"]]; uiiv.userInteractionEnabled = NO; uiiv.opaque = YES; //for performance [self.view addSubview:uiiv]; [uiiv release];

Método delegado UIPickerView:

-(UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)rowforComponent:(NSInteger)component reusingView:(UIView *)view { UIView *viewForRow = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 280)] autorelease]; UIImageView *img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myimage.png"]]; img.frame = CGRectMake(0, 0, 102,280); img.opaque = YES; [viewForRow addSubview:img]; [img release]; UILabel *label; UIFont *font = [ UIFont fontWithName:@"Helvetica" size:20]; label = [[[UILabel alloc] initWithFrame:CGRectMake(10, 20, 270, 100)] autorelease]; label.text = @"I am a label"; label.textAlignment = UITextAlignmentCenter; label.textColor = [UIColor blackColor]; label.font = font; label.backgroundColor = [UIColor clearColor]; label.opaque = NO; [viewForRow addSubview:label]; CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57); [viewForRow setTransform:rotate]; return viewForRow; }

Esto le da un selector horizontal mucho más pequeño con un aspecto agradable. Espero que esto ayude a alguien.


No hay problema (me acabo de registrar). Por cierto, me acabo de dar cuenta de que cuando (UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent .... mi respuesta, el método (UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent .... perdió el espacio entre row y forComponent. Así que asegúrese de que tiene el delegado correcto o de lo contrario no funcionará.


Luché con el mismo problema de cambiar el tamaño de la vista de selección. Después de algunas investigaciones y dolores de cabeza aquí hay algo que puedes hacer fácilmente:

  1. Olvidate del constructor de interfaz Creo que puedes mejorar la interfaz de usuario sin el constructor de interfaz.
  2. En sus controladores sobrescribe el método de vista de carga.

    -(void)loadView { //create your view self.view = [[UIView alloc] initWithFrame:CGRectZero]; // create a default sized pickerView pickerView = [[UIPickerView alloc] initWithFrame:CGRectZero]; pickerView.delegate = self; pickerView.dataSource = self; pickerView.showsSelectionIndicator = YES; // Get its frame CGRect pickerFrame = pickerView.frame; // Set it to what ever you like, I use a default screen height times a shrink factor like 0.75 for 3/4 of its original size pickerFrame.size.width = screenWidth*pickerShrinkFactor; pickerFrame.size.height = pickerHeight*pickerShrinkFactor; // You can also set the upper left corner of the picker pickerFrame.origin.x = 0; // Set the picker frame to new size and origin pickerView.frame = pickerFrame; // Add it to your view [self.view addSubview:pickerView]; }

Buena suerte