动态更改UILabel的字体大小

Cod*_*Guy 182 fonts objective-c uilabel ios

我目前有一个UILabel:

factLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 280, 100)];
factLabel.text = @"some text some text some text some text";
factLabel.backgroundColor = [UIColor clearColor];
factLabel.lineBreakMode = UILineBreakModeWordWrap;
factLabel.numberOfLines = 10;
[self.view addSubview:factLabel];
Run Code Online (Sandbox Code Playgroud)

在我的iOS应用程序的整个生命周期中,factLabel获取一堆不同的值.有些有多个句子,有些只有5或6个单词.

如何设置,UILabel以便字体大小更改,以便文本始终适合我定义的范围?

Mar*_*aev 348

单线:

factLabel.numberOfLines = 1;
factLabel.minimumFontSize = 8;
factLabel.adjustsFontSizeToFitWidth = YES;
Run Code Online (Sandbox Code Playgroud)

上面的代码会将文本的字体大小调整为(例如)8尝试在标签中插入文本. numberOfLines = 1是强制性的.

多行:

因为numberOfLines > 1有一种方法可以通过NSString的UIKit添加方法来计算最终文本的大小,例如:

CGSize lLabelSize = [yourText sizeWithFont:factLabel.font
                                  forWidth:factLabel.frame.size.width
                             lineBreakMode:factLabel.lineBreakMode];
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用结果调整标签大小lLabelSize(例如,假设您只更改标签的高度):

factLabel.frame = CGRectMake(factLabel.frame.origin.x, factLabel.frame.origin.y, factLabel.frame.size.width, lLabelSize.height);
Run Code Online (Sandbox Code Playgroud)

iOS6的

单线:

从iOS6开始,minimumFontSize已被弃用.这条线

factLabel.minimumFontSize = 8.;
Run Code Online (Sandbox Code Playgroud)

可以改为:

factLabel.minimumScaleFactor = 8./factLabel.font.pointSize;
Run Code Online (Sandbox Code Playgroud)

IOS 7

多行:

从iOS7开始,sizeWithFont已弃用.多线案例减少为:

factLabel.numberOfLines = 0;
factLabel.lineBreakMode = NSLineBreakByWordWrapping;
CGSize maximumLabelSize = CGSizeMake(factLabel.frame.size.width, CGFLOAT_MAX);
CGSize expectSize = [factLabel sizeThatFits:maximumLabelSize];
factLabel.frame = CGRectMake(factLabel.frame.origin.x, factLabel.frame.origin.y, expectSize.width, expectSize.height);
Run Code Online (Sandbox Code Playgroud)

  • 它从iOS6开始就被弃用了.用`myLabel.minimumScaleFactor:10.0/[UIFont labelFontSize]替换它;` (6认同)

小智 71

minimumFontSize已被iOS 6弃用.您可以使用minimumScaleFactor.

yourLabel.adjustsFontSizeToFitWidth=YES;
yourLabel.minimumScaleFactor=0.5;
Run Code Online (Sandbox Code Playgroud)

这将根据标签和文本的宽度来处理您的字体大小.

  • 不适用于高度,宽度 (4认同)

Pau*_*ida 24

根据@Eyal Ben Dov的回答,您可能希望创建一个类别,以便在您的其他应用程序中灵活使用.

Obs.:我已经更新了他的代码以与iOS 7兼容

- 头文件

#import <UIKit/UIKit.h>

@interface UILabel (DynamicFontSize)

-(void) adjustFontSizeToFillItsContents;

@end
Run Code Online (Sandbox Code Playgroud)

- 实现文件

#import "UILabel+DynamicFontSize.h"

@implementation UILabel (DynamicFontSize)

#define CATEGORY_DYNAMIC_FONT_SIZE_MAXIMUM_VALUE 35
#define CATEGORY_DYNAMIC_FONT_SIZE_MINIMUM_VALUE 3

-(void) adjustFontSizeToFillItsContents
{
    NSString* text = self.text;

    for (int i = CATEGORY_DYNAMIC_FONT_SIZE_MAXIMUM_VALUE; i>CATEGORY_DYNAMIC_FONT_SIZE_MINIMUM_VALUE; i--) {

        UIFont *font = [UIFont fontWithName:self.font.fontName size:(CGFloat)i];
        NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];

        CGRect rectSize = [attributedText boundingRectWithSize:CGSizeMake(self.frame.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:nil];

        if (rectSize.size.height <= self.frame.size.height) {
            self.font = [UIFont fontWithName:self.font.fontName size:(CGFloat)i];
            break;
        }
    }

}

@end
Run Code Online (Sandbox Code Playgroud)

-用法

#import "UILabel+DynamicFontSize.h"

[myUILabel adjustFontSizeToFillItsContents];
Run Code Online (Sandbox Code Playgroud)

干杯


Dev*_*ngh 23

单行 - 有两种方法,你可以简单地改变.

1-实用(Swift 3)

只需添加以下代码即可

    yourLabel.numberOfLines = 1;
    yourLabel.minimumScaleFactor = 0.7;
    yourLabel.adjustsFontSizeToFitWidth = true;
Run Code Online (Sandbox Code Playgroud)

2 - 使用UILabel属性检查器

i- Select your label- Set number of lines 1.
ii- Autoshrink-  Select Minimum Font Scale from drop down
iii- Set Minimum Font Scale value as you wish , I have set 0.7 as in below image. (default is 0.5)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 在 Interface Builder 中执行此操作的麻烦要少得多,因此您提到这两种方法真是太棒了! (2认同)

zav*_*tra 22

这是2015年.我不得不去寻找一篇博文,解释如何使用Swift为最新版本的iOS和XCode做到这一点,以便它可以使用多行.

  1. 将"自动收缩"设置为"最小字体大小".
  2. 将字体设置为最大的理想字体大小(我选择了20)
  3. 将"换行符"从"自动换行"更改为"截断尾巴".

资料来源:http: //beckyhansmeyer.com/2015/04/09/autoshrinking-text-in-a-multiline-uilabel/

  • 超级酷。.截尾尾点是最重要的。.自动换行时,Coz不会减小字体大小的冲动,而当截断尾翼时,自动换尾必须保存刀片中的文本,然后调整字体大小。 (2认同)

Esq*_*uth 12

Swift版本:

textLabel.adjustsFontSizeToFitWidth = true
textLabel.minimumScaleFactor = 0.5
Run Code Online (Sandbox Code Playgroud)


小智 7

这是UILabel的Swift扩展.它运行二进制搜索算法,根据标签边界的宽度和高度调整字体大小.经测试可与iOS 9和autolayout配合使用.

用法:<label>预定义的UILabel 在哪里需要调整字体大小

<label>.fitFontForSize()
Run Code Online (Sandbox Code Playgroud)

默认情况下,此功能在5pt和300pt字体大小的范围内搜索,并设置字体以使其文本"完美"在边界内(精确到1.0pt内).您可以定义参数,例如,它可以通过以下方式在1pt内准确搜索1pt标签的当前字体大小:

<label>.fitFontForSize(1.0, maxFontSize: <label>.font.pointSize, accuracy:0.1)
Run Code Online (Sandbox Code Playgroud)

将以下代码复制/粘贴到您的文件中

extension UILabel {

    func fitFontForSize(var minFontSize : CGFloat = 5.0, var maxFontSize : CGFloat = 300.0, accuracy : CGFloat = 1.0) {
        assert(maxFontSize > minFontSize)
        layoutIfNeeded() // Can be removed at your own discretion
        let constrainedSize = bounds.size
        while maxFontSize - minFontSize > accuracy {
            let midFontSize : CGFloat = ((minFontSize + maxFontSize) / 2)
            font = font.fontWithSize(midFontSize)
            sizeToFit()
            let checkSize : CGSize = bounds.size
            if  checkSize.height < constrainedSize.height && checkSize.width < constrainedSize.width {
                minFontSize = midFontSize
            } else {
                maxFontSize = midFontSize
            }
        }
        font = font.fontWithSize(minFontSize)
        sizeToFit()
        layoutIfNeeded() // Can be removed at your own discretion
    }

}
Run Code Online (Sandbox Code Playgroud)

注意:layoutIfNeeded()可以自行决定删除每个呼叫