2009-12-08 42 views
7

我目前正在從我的核心數據設置動態填充選擇器視圖的程序。我有一切工作在數據方面,但我現在遇到的問題是在我的標籤上格式化。UIPickerView與多行UILabel

選取器在工具欄的右側出現一個按鈕,在其中顯示自己的工具欄。它的初始狀態是2個可見的撥號。當按下按鈕時,它變爲3個撥號。

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

我已經手動將行高設置爲32.0f。我得到了非常奇怪的結果,第二個組件中的一些標籤完美地工作。但其他人根本沒有包裝,有些只是表現爲空白。

ie:抱子甘藍包好(右分量)。但牛奶和奶油不顯示(只有牛奶是可見的)蔬菜根本沒有出現。我的代碼在哪裏出錯?

+0

謝謝,這真的幫助了我。 – 2011-05-19 02:44:38

回答

2

我設法讓它表現得很好。我通過刪除


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

改變了最後一部分,我手動


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

不知道設置幀爲什麼這個工作,而動態調整沒有。

1

下面是迅速的一個版本。

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

我更正了您的代碼,以便讓標籤寬度適合選取器寬度。 我使用了koushi方法。現在它工作得很好。 看到我的代碼在這裏附加。

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

    } 

關於你的原始代碼:我認爲有不同的矩形大小的元素的選擇器,不利於appeareance(用戶體驗)的事情。我懷疑不同的標籤矩形大小是在你的代碼中發現問題。如果您要顯示的文本可能比定義的矩形大,我認爲您應該使用不同的應用程序結構方法。

注:在我的應用我用的是選擇器標籤屬性來確定選擇了哪個選擇器,因爲我有我的觀點不止一個選擇器。出於這個原因,我換成了「開關」語句在您的代碼與下面的代碼:

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

,顯然我還補充說:

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

}