How to change the Font size in UIPickerView?

IphoneUipickerviewFont Size

Iphone Problem Overview


I have one UIPickerView. This is having nearly 200 items, each items has long texts, so, i want to resize the UIPickerView's font size. How can i change it? It is possible? Can any one help me? Thanks !

Yuva.M

Iphone Solutions


Solution 1 - Iphone

You need to implement pickerView:viewForRow:forComponent:reusingView: method in picker's delegate

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

Solution 2 - Iphone

Update in Swift for iOS8, you can add this to your delegate:

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

Solution 3 - Iphone

Swift 4: to update @Alessandro Ornano answer and avoid Force_cast violation error:

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
}

Solution 4 - Iphone


For Font adjustment of UIPickerView Rows

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

Solution 5 - Iphone

Try this, it should help:

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

Solution 6 - Iphone

Swift 3 | AUTOSHRINK

Set adjustsFontSizeToFitWidth=true and minimumScaleFactor=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
}

Solution 7 - Iphone

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
    }

Solution 8 - Iphone

Clean Swift solution without force unwrapping

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

Solution 9 - Iphone

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

For 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
        
    }

Solution 10 - Iphone

To set the system font, need to do bit differently, like below:

let pickerLabel = UILabel()
pickerLabel.font = UIFont.systemFont(ofSize: 20.0, weight: .medium)

you can choose any weight like regular, bold, etc

Solution 11 - Iphone

Most answers provide solution for center aligned label. I had to align text to the left side and faced the fact text has been cut off. Adding margin to left solved the problem for me. Solution works for swift 5.

    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
        
        let pickerLabel: UILabel
        
        if let label = view as? UILabel {
            pickerLabel = label
        } else {
            pickerLabel = UILabel()
            // Customize text
            pickerLabel.font = pickerLabel.font.withSize(20)
            pickerLabel.textAlignment = .left
            pickerLabel.textColor = UIColor.secondaryLabel
            // Create a paragraph with custom style
            // We only need indents to prevent text from being cut off
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.firstLineHeadIndent = 12 // May vary
            // Create a string and append style to it
            let attributedString = NSMutableAttributedString(string: subjects[row])
            attributedString.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))
            // Update label's text
            pickerLabel.attributedText = attributedString
        }
        
        return pickerLabel
    }

Solution 12 - Iphone

For RxSwift users, please take away this.

        Observable.just(["option1", "option2", "option3"])
            .bind(to: pickerView.rx.items) { row, option, view in
                let label = (view as? UILabel) ?? .init()
                
                label.font = .preferredFont(forTextStyle: .title1)
                label.adjustsFontSizeToFitWidth = true
                label.minimumScaleFactor = 0.5
                label.text = option
                label.textAlignment = .center
                
                return label
            }
            .disposed(by: bag)

Using iOS predefined title1 font so it can resize according to user's display settings; setting minimumScaleFactor to 0.5 so font can shrink on long text.

One thing to notice is that UIPickerView doesn't seem to allow multi-lines text, even by doing label.numberOfLines = 2 // or 0 won't do you any favour, I guess it is just not designed for displaying long text options.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionYuvaraj.MView Question on Stackoverflow
Solution 1 - IphoneNitishView Answer on Stackoverflow
Solution 2 - IphonebownieView Answer on Stackoverflow
Solution 3 - IphoneGrégView Answer on Stackoverflow
Solution 4 - IphoneSivasagar PalakurthyView Answer on Stackoverflow
Solution 5 - IphoneAnnView Answer on Stackoverflow
Solution 6 - IphoneDerek SoikeView Answer on Stackoverflow
Solution 7 - IphoneAlessandro OrnanoView Answer on Stackoverflow
Solution 8 - IphoneWalter WhiteView Answer on Stackoverflow
Solution 9 - IphoneNischal HadaView Answer on Stackoverflow
Solution 10 - IphonePandurang YachwadView Answer on Stackoverflow
Solution 11 - IphonemikstimeView Answer on Stackoverflow
Solution 12 - IphoneDaniel HuView Answer on Stackoverflow