2009-12-08 55 views
7

Actualmente estoy trabajando en un programa que rellena dinámicamente una vista del selector desde mi configuración de Core Data. Tengo todo funcionando en lo que respecta a los datos, pero el problema que me estoy encontrando ahora es formatear en mis etiquetas.UIPickerView con Multiline UILabel

El selector se presenta con su propia barra de herramientas en una hoja de acción con un botón en el lado derecho de la barra de herramientas. Su estado inicial es con 2 diales visibles. cuando se presiona el botón, cambia a 3 diales.

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

    CGSize limitSize = CGSizeMake(100.0f, 45.0f); 
    CGSize textSize; 
    CGRect labelRect; 
    NSString *title = @""; 


    switch (numberOfComponents){ 
     case 2: 
     { 
      ...gets strings from fetched data (varying length from 4 to 20+) 
        title = someString 
     } 
     case 3: 
     { 
      ...same as above but for the second set of data. 
        title = someString 
     }   
    } 


    textSize = [title sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:limitSize lineBreakMode:UILineBreakModeWordWrap]; 
    labelRect = CGRectMake(0, 0, textSize.width, textSize.height); 
    NSLog(@"length:%i title:%@",[title length],title); 
    NSLog(@"h:%f w:%f",textSize.height,textSize.width); 
    if (pickerLabel == nil) 
    { 
     pickerLabel = [[[UILabel alloc] initWithFrame:labelRect] autorelease]; 
     [pickerLabel setFont:[UIFont systemFontOfSize:14]]; 
     [pickerLabel setBackgroundColor:[UIColor clearColor]]; 
     [pickerLabel setLineBreakMode:UILineBreakModeWordWrap]; 
     [pickerLabel setTextAlignment:UITextAlignmentCenter]; 
     [pickerLabel setNumberOfLines:2]; 
    } 

    [pickerLabel setText:title];  

    return pickerLabel; 
} 

he configurado manualmente la altura de la fila en 32.0f. Estoy obteniendo resultados muy extraños porque algunas de las etiquetas del segundo componente funcionan a la perfección. pero otros no se ajustan en absoluto, y algunos simplemente se muestran como espacios en blanco.

es decir: coles de Bruselas se envuelve bien (componente derecho). pero Milk and Cream no muestra (solo la leche es visible) verduras no aparece en absoluto. ¿Dónde me estoy equivocando en mi código?

+0

Gracias, esto realmente me ayudó. –

Respuesta

2

Logré que se comportara bien. He cambiado la última parte mediante la eliminación de


textSize = [title sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:limitSize lineBreakMode:UILineBreakModeWordWrap]; 

y me puse el marco manualmente


labelRect = CGRectMake(0,0,100.0,36.0); 
no

seguro de por qué esto funcionó mientras que el tamaño dinámico no lo hicieron.

1

Aquí hay una versión para swift.

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView { 
    var label : UILabel 
    if view == nil { 
     label = UILabel(frame: CGRect(x: 0, y: 0, width: 0, height: UIFont.systemFontOfSize(UIFont.systemFontSize()).lineHeight * 2 * UIScreen.mainScreen().scale)) 
     label.textAlignment = NSTextAlignment.Center 
     label.numberOfLines = 2 
     label.lineBreakMode = NSLineBreakMode.ByWordWrapping 
     label.autoresizingMask = UIViewAutoresizing.FlexibleWidth 
    } else { 
     label = view as UILabel 
    } 
    label.text = line1 + "\n" + line2 

    return label; 
} 

func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { 
    return UIFont.systemFontOfSize(UIFont.systemFontSize()).lineHeight * 2 * UIScreen.mainScreen().scale 
} 
0

corregí su código, con el fin de permitir que el ancho de la etiqueta a la anchura selector. Utilicé el enfoque koushi. Funciona muy bien ahora. Ver mi código aquí anexado.

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

//assegna i nomi alle caselle del picker e assegna anche la dimensione del font e del rettangolo che contiene le scritte 

UILabel *pickerLabel = (UILabel *)view; 
CGRect labelRect; 

NSString *[email protected]""; 
switch (numberOfComponents){ 
case 2: 
{ 
    ...gets strings from fetched data (varying length from 4 to 20+) 
       title = someString 
} 
case 3: 
{ 
    ...same as above but for the second set of data. 
       title = someString 
}   
} 

CGFloat labelWidth=pickerView.frame.size.width-50; 
labelRect = CGRectMake(0,0,labelWidth,45.0); 

if (pickerLabel == nil) 
{ 
    pickerLabel = [[UILabel alloc] initWithFrame:labelRect]; 
    [pickerLabel setFont:[UIFont systemFontOfSize:16]]; 
    [pickerLabel setBackgroundColor:[UIColor clearColor]]; 
    [pickerLabel setNumberOfLines:2]; 
} 

[pickerLabel setText:title];  
return pickerLabel; 

    } 

Acerca de su código original: Creo que para tener un selector con elementos de diferente tamaño rect no es bueno para APARIENCIA (experiencia de usuario) cuestión. Sospecho que el tamaño de las etiquetas diferentes está generando el problema en tu código. Si el texto que desea mostrar puede ser más grande que el rect definido, creo que debe utilizar un enfoque de estructura de aplicación diferente.

NOTA: en mi aplicación utilizo la propiedad de etiqueta de selector para identificar qué selector fue seleccionado, porque tengo más de un selector en mi opinión. Por esta razón he sustituido la frase "interruptor" en el código con el siguiente código:

if (pickerView.tag==1) 
    title= globalSubcategoryArray[row]; 
    else 
    title= globalAreasName[row]; 

y, obviamente, he añadido también:

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 
if (pickerView.tag==1) 
    return globalSubcategoryArray.count; 
else  
    return globalAreasName.count; 
} 

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
return 1; 
} 



-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
if (pickerView.tag==1){ 
    self.subcategoryTextview.text = globalSubcategoryArray[row]; 
    globalSelectedSubcategoryIndex=row; 
    [self.subcategoryTextview resignFirstResponder]; 

}else{ 
    self.areaTextview.text= globalAreasName[row]; 
    globalSelectedAreaIndex=row; 
    [self.areaTextview resignFirstResponder]; 
} 

}