2009-12-08 14 views
7

Obecnie pracuję nad programem, który dynamicznie wypełnia widok pobrania z mojej konfiguracji danych podstawowych. Mam wszystko pod kontrolą danych, ale problemem, na który teraz natrafiłem, jest formatowanie na moich etykietach.UIPickerView z Multiline UILabel

Selektor jest prezentowany z własnym paskiem narzędzi w arkuszu akcji za pomocą przycisku po prawej stronie paska narzędzi. Jego stan początkowy jest widoczny z 2 tarczami. po naciśnięciu przycisku zmienia się na 3 pokrętła.

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

Ręcznie ustawiłem wysokość wiersza na 32.0f. Otrzymuję bardzo dziwne wyniki, ponieważ niektóre etykiety w drugim komponencie działają doskonale. ale inne nie owijają się w ogóle, a niektóre po prostu pokazują się jako puste miejsce.

np .: brukselka zawija się dobrze (prawy składnik). ale Mleko i Śmietanka się nie wyświetlają (widać tylko mleko) warzywa w ogóle się nie pojawiają. Gdzie się mylę w moim kodzie?

+0

Dzięki, to naprawdę pomogło mi. –

Odpowiedz

2

Udało mi się go ładnie zachowywać. Zmieniłem ostatnią część usuwając


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

i ustawić ramkę ręcznie


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

wiem, dlaczego to działało natomiast dynamicznie wielkości nie.

1

Oto wersja na szybkie.

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

Poprawiłem twój kod, aby szerokość etykiety pasowała do szerokości selektora. Użyłem podejścia koushi. Teraz działa bardzo dobrze. Zobacz mój kod tutaj dołączony.

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

    } 

O oryginalnego kodu: Myślę, że aby mieć próbnik z elementów o różnej wielkości rect nie jest dobre dla appeareance (user experience) materii. Podejrzewam, że różne rozmiary etykiet mają wpływ na problem w kodzie. Jeśli tekst, który chcesz wyświetlić, może być większy niż zdefiniowany rect, myślę, że powinieneś użyć innego podejścia do struktury aplikacji.

UWAGA: w mojej aplikacji używam właściwości znacznika wyboru, aby określić, który selektor został wybrany, ponieważ mam więcej niż jeden selektor w moim widoku. Z tego powodu wymieniłem instrukcji „switch” w kodzie za pomocą następującego kodu:

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

i oczywiście dodałem również:

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

}