2009-12-08 40 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]; 
} 

}