如何在UIPickerView中改变字体大小?

65

我有一个UIPickerView。其中有近200个选项,每个选项都有很长的文本,所以我想调整UIPickerView的字体大小。我该如何改变它?这是可能的吗? 有人能帮我吗?谢谢!

Yuva.M


请查看以下链接以了解如何更改UIPickerView的文本大小和组件宽度:https://dev59.com/e3VC5IYBdhLWcg3wjx1d - Narayanan Ramamoorthy
可能是有可能的,但我认为UIPickerView不应该显示长文本。对于用户来说阅读长文本会很繁琐,即使它们有200个。也许你可以重新考虑你的设计。 - Akshay
谢谢Narayanan Ramamoorthy和Akshay,我解决了这个问题。非常感谢你们的回复。 - Yuvaraj.M
13个回答

95

你需要在选择器的代理中实现pickerView:viewForRow:forComponent:reusingView:方法。

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
    UILabel* tView = (UILabel*)view;
    if (!tView){
        tView = [[UILabel alloc] init];
            // Setup label properties - frame, font, colors etc
            ...
    }
    // Fill the label text here
    ...
    return tView;
}

33

iOS8中的Swift更新,您可以将以下内容添加到您的代理:

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView {

    var pickerLabel = view as? UILabel;

    if (pickerLabel == nil)
    {
        pickerLabel = UILabel()

        pickerLabel?.font = UIFont(name: "Montserrat", size: 16)
        pickerLabel?.textAlignment = NSTextAlignment.Center
    }

    pickerLabel?.text = fetchLabelForRowNumber(row)

    return pickerLabel!;
}

只有当我执行类似以下操作时,大小才会更改... pickerLabel?.font = UIFont.systemFont(ofSize: 20) - Bradley Thomas

26

Swift 4: 更新 @Alessandro Ornano 的答案并避免 Force_cast 违规错误:

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
    var label = UILabel()
    if let v = view as? UILabel { label = v }
    label.font = UIFont (name: "Helvetica Neue", size: 10)
    label.text =  dataArray[row]
    label.textAlignment = .center
    return label
}

1
最佳答案总是在 SO 的底部!! - Pulkit
2
你在此处不必要地创建了一个标签...尝试更改 let label - (view as? Label) ?? UILabel(),或者更好的做法是调用某个构建器变量,该变量会返回一个设置字体和对齐方式的新标签。然后你就不必每次都设置它们了。 - Magoo

16

关于UIPickerView行的字体调整


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

    if (!pickerLabel)
    {
        pickerLabel = [[UILabel alloc] init];

        pickerLabel.font = [UIFont fontWithName:@"SourceSansPro-Semibold"                size:16];

        pickerLabel.textAlignment=NSTextAlignmentCenter;
    }
    [pickerLabel setText:[self.data objectAtIndex:row]];

    return pickerLabel;
}

8

试试这个,它应该会有所帮助:

  - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
UILabel* tView = (UILabel*)view;
if (!tView){
tView = [[UILabel alloc] init];
// Setup label properties - frame, font, colors etc
...
//adjustsFontSizeToFitWidth property to YES
tView.minimumFontSize = 8.;
tView.adjustsFontSizeToFitWidth = YES;
}
// Fill the label text here
...
return tView;
}


// altro modo completo sembrerebbe...
- (UIView *)pickerView:(UIPickerView *)pickerView
viewForRow:(NSInteger)row
forComponent:(NSInteger)component
reusingView:(UIView *)view {

UILabel *pickerLabel = (UILabel *)view;

if (pickerLabel == nil) {
CGRect frame = CGRectMake(0.0, 0.0, 80, 32);
pickerLabel = [[[UILabel alloc] initWithFrame:frame] autorelease];
[pickerLabel setTextAlignment:UITextAlignmentLeft];
[pickerLabel setBackgroundColor:[UIColor clearColor]];
[pickerLabel setFont:[UIFont boldSystemFontOfSize:15]];
}

[pickerLabel setText:[pickerDataArray objectAtIndex:row]];

return pickerLabel;

}

请注意,.minimumFontSize已被弃用,应该被替换为.setMinimumScaleFactor。 - Javier Calatrava Llavería
使用NSTextAlignmentLeft,因为UITextAlignmentLeft在IOS 6.0中已被弃用。 [pickerLabel setTextAlignment:NSTextAlignmentLeft]; - karan

6

Swift 4.x

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
        var label = UILabel()
        if let v = view {
            label = v as! UILabel
        }
        label.font = UIFont (name: "Helvetica Neue", size: 10)
        label.text =  dataArray[row]
        label.textAlignment = .center
        return label
    }

6

Swift 3 | AUTOSHRINK

adjustsFontSizeToFitWidth=trueminimumScaleFactor=0.5设置为真。

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {

    var label: UILabel
    if let view = view as? UILabel { label = view }
    else { label = UILabel() }

    label.text = "My Picker Text"
    label.textAlignment = .center
    label.font = UIFont.boldSystemFont(ofSize: 20)
    label.adjustsFontSizeToFitWidth = true
    label.minimumScaleFactor = 0.5

    return label
}

每一行的文本都显示为“...”。嗯。 - codeslapper
使用这些解决方案都没有看到外观上的变化。这个确实将文本更改为...,因此正在运行代码。也许UIPickerView需要以某种方式调整大小或在InterfaceBuilder中设置? - codeslapper
@codeslapper 是的,我认为你的UIPickerView的大小是导致文本显示为“...”的原因。尝试更改 yourPickerView.frame.size.width 或通过Interface Builder设置大小。 - Derek Soike

3

对于Objective C

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

    UILabel* pickerLabel = (UILabel*)view;
    if (!pickerLabel){
        pickerLabel = [[UILabel alloc] init];
        // Setup label properties - frame, font, colors etc
        [pickerLabel setFont:[UIFont fontWithName:LATO_REGULAR_FONT size:SIZE_SEMIBOLD_FONT]];
        pickerLabel.textColor = primaryTextColor;
        pickerLabel.textAlignment = NSTextAlignmentCenter;


    }
    // Fill the label text here
    pickerLabel.text = self.dataSourceArray[row];

    return pickerLabel;
}

针对Swift 2.3版本

  func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView{

        var label = view as! UILabel!
        if label == nil {
            label = UILabel()
        }

        label.font = LATO_REGULAR_FONT_17
        label.text =  dataArray[row] as? String
        label.textAlignment = .Center
        return label

    }

3

无需强制解包的简洁Swift解决方案

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
    let label = (view as? UILabel) ?? UILabel()
    
    // setup label
    
    return label
}

2

不需要 ! 或不必要的重新配置的易读的 Swift 版本

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
    let label: UILabel = (view as? UILabel) ?? {
        let label: UILabel = UILabel()
        label.font = UIFont.systemFont(ofSize: 12)
        label.textAlignment = .center
        return label
    }()
    label.text = self.pickerView(pickerView, titleForRow: row, forComponent: component)
    return label
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    items[row].title
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接