2009-12-08 16 views
7

Attualmente sto lavorando a un programma che popola una vista di selezione dinamicamente dal mio set di dati di base. Ho tutto funzionante in termini di dati, ma il problema che sto incontrando ora è la formattazione sulle mie etichette.UIPickerView con multilinea UILabel

Il selettore viene presentato con la propria barra degli strumenti in un foglio di azioni con un pulsante sul lato destro della barra degli strumenti. Lo stato iniziale è con 2 quadranti visibili. quando il pulsante viene premuto, passa a 3 quadranti.

- (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; 
} 

ho impostato manualmente l'altezza della riga a 32.0f. Ottengo risultati molto strani in quanto alcune delle etichette del secondo componente funzionano perfettamente. ma altri non stanno affatto avvolgendo, e alcuni stanno semplicemente mostrando uno spazio vuoto.

es .: il cavoletto di Bruxelles avvolge bene (componente destro). ma Latte e crema non vengono visualizzate (solo il latte è visibile) le verdure non appaiono affatto. Dove sto andando male nel mio codice?

+0

Grazie, questo mi ha veramente aiutato. –

risposta

2

Sono riuscito a farlo comportarsi bene. Ho cambiato l'ultima parte rimuovendo


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

e ho impostato manualmente


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

che la cornice perché questo ha funzionato mentre l'dimensionato dinamicamente no.

1

Ecco una versione per 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

Ho corretto il codice per consentire alla larghezza dell'etichetta di adattarsi alla larghezza del raccoglitore. Ho usato l'approccio Koushi. Funziona molto bene ora. Vedere il mio codice qui allegato.

- (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; 

    } 

Informazioni sul codice originale: penso che per avere un selettore con elementi di diverse dimensioni rect non è buono per appeareance (user experience) la materia. Ho il sospetto che le diverse dimensioni delle etichette abbiano peggiorato il problema nel codice. Se il testo che vuoi mostrare può essere più grande del rect definito, penso che dovresti usare un approccio diverso alla struttura delle app.

NOTA: nella mia app uso la proprietà del tag di selezione per identificare quale picker è stato selezionato, perché ho più di un selezionatore nella mia vista. Per questo motivo ho sostituito l'istruzione "switch" nel codice con il seguente codice:

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

e, ovviamente, ho aggiunto anche:

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

} 
Problemi correlati