Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 动态更改UILabel的字体大小_Ios_Objective C_Fonts_Uilabel - Fatal编程技术网

Ios 动态更改UILabel的字体大小

Ios 动态更改UILabel的字体大小,ios,objective-c,fonts,uilabel,Ios,Objective C,Fonts,Uilabel,我目前有一个ui标签: 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; f

我目前有一个
ui标签

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];
在我的iOS应用程序的整个生命周期中,
factLabel
获取一系列不同的值。有些是多句话,有些只有5到6个单词

如何设置
ui标签
,使字体大小改变,使文本始终符合我定义的边界?

单行:

上面的代码会将文本的字体大小调整为(例如)
8
,以使文本适合标签。
numberOfLines=1
是必需的

多行:

对于
numberOfLines>1
有一种通过方法计算最终文本大小的方法,例如:

CGSize lLabelSize = [yourText sizeWithFont:factLabel.font
                                  forWidth:factLabel.frame.size.width
                             lineBreakMode:factLabel.lineBreakMode];
之后,您可以使用生成的
lLabelSize
调整标签大小,例如(假设您只更改标签的高度):

iOS6

单线:

从iOS6开始,
minimumFontSize
已被弃用。线路

factLabel.minimumFontSize = 8.;
可更改为:

factLabel.minimumScaleFactor = 8./factLabel.font.pointSize;
iOS7

多行:

从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);
iOS 13(Swift 5):

label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.5
private func adapteSizeLabel(label: UILabel, sizeMax: CGFloat) {
     label.numberOfLines = 0
     label.lineBreakMode = NSLineBreakMode.ByWordWrapping
     let maximumLabelSize = CGSizeMake(label.frame.size.width, sizeMax);
     let expectSize = label.sizeThatFits(maximumLabelSize)
     label.frame = CGRectMake(label.frame.origin.x, label.frame.origin.y, expectSize.width, expectSize.height)
}

只需将sizeToFit消息发送到UITextView即可。它将调整自己的高度,以刚好适合其文本。它不会更改自身的宽度或原点

[textViewA1 sizeToFit];

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

yourLabel.adjustsFontSizeToFitWidth=YES;
yourLabel.minimumScaleFactor=0.5;

这将根据标签和文本的宽度来调整字体大小。

这有点不复杂,但应该可以, 例如,假设您希望将uilabel限制为120x120,最大字体大小为28:

magicLabel.numberOfLines = 0;
magicLabel.lineBreakMode = NSLineBreakByWordWrapping;
...
magicLabel.text = text;
    for (int i = 28; i>3; i--) {
        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:(CGFloat)i] constrainedToSize:CGSizeMake(120.0f, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
        if (size.height < 120) {
            magicLabel.font = [UIFont systemFontOfSize:(CGFloat)i];
            break;
        }
    }
magicLabel.numberOfLines=0;
magicLabel.lineBreakMode=NSLineBreakByWordWrapping;
...
magicLabel.text=文本;
对于(int i=28;i>3;i--){
CGSize size=[text sizeWithFont:[UIFont systemFontOfSize:(CGFloat)i]约束大小:CGSizeMake(120.0f,CGFloat_MAX)lineBreakMode:NSLineBreakByWordWrapping];
如果(尺寸高度<120){
magicLabel.font=[UIFont-systemFontOfSize:(CGFloat)i];
打破
}
}

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

Obs:我已经更新了他的代码,使其与iOS 7兼容

-头文件

#import <UIKit/UIKit.h>

@interface UILabel (DynamicFontSize)

-(void) adjustFontSizeToFillItsContents;

@end
#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
#import "UILabel+DynamicFontSize.h"

[myUILabel adjustFontSizeToFillItsContents];
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
    }

}
干杯

Swift版本:

textLabel.adjustsFontSizeToFitWidth = true
textLabel.minimumScaleFactor = 0.5

现在是2015年。我不得不去找一篇博文,解释如何使用Swift在最新版本的iOS和XCode上实现这一点,以便它可以使用多行代码

  • 将“自动收缩”设置为“最小字体大小”
  • 将字体设置为所需的最大字体大小(我选择了20)
  • 将“换行符”从“换行”更改为“截断尾部”
  • 资料来源:
    这里是UILabel的快速扩展。它运行一个二进制搜索算法,根据标签边界的宽度和高度调整字体大小。经测试可与iOS 9和自动布局一起使用

    用法:其中
    是需要调整字体大小的预定义UILabel

    <label>.fitFontForSize()
    
    .fitFontForSize()
    
    默认情况下,此函数在5pt和300pt字体大小范围内搜索,并将字体设置为在边界内“完全”匹配文本(精确到1.0pt)。您可以定义参数,例如,它可以在1pt标签的当前字体大小之间进行搜索,精确搜索范围为0.1pt,搜索方式如下:

    <label>.fitFontForSize(1.0, maxFontSize: <label>.font.pointSize, accuracy:0.1)
    
    .fitFontForSize(1.0,maxFontSize:.font.pointSize,精度:0.1)
    
    将以下代码复制/粘贴到您的文件中

    #import <UIKit/UIKit.h>
    
    @interface UILabel (DynamicFontSize)
    
    -(void) adjustFontSizeToFillItsContents;
    
    @end
    
    #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
    
    #import "UILabel+DynamicFontSize.h"
    
    [myUILabel adjustFontSizeToFillItsContents];
    
    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
        }
    
    }
    
    扩展UILabel{ func fitFontForSize(变量minFontSize:CGFloat=5.0,变量maxFontSize:CGFloat=300.0,精度:CGFloat=1.0){ 断言(maxFontSize>minFontSize) layoutifneedd()//可以自行删除 让constrainedSize=bounds.size 而maxFontSize-minFontSize>精度{ 让midFontSize:CGFloat=((minFontSize+maxFontSize)/2) font=font.fontWithSize(midFontSize) sizeToFit() 让checkSize:CGSize=bounds.size 如果checkSize.height
    注意:每个
    layoutifneed()
    调用都可以自行删除

    Swift 2.0版本:

    label.adjustsFontSizeToFitWidth = true
    label.minimumScaleFactor = 0.5
    
    private func adapteSizeLabel(label: UILabel, sizeMax: CGFloat) {
         label.numberOfLines = 0
         label.lineBreakMode = NSLineBreakMode.ByWordWrapping
         let maximumLabelSize = CGSizeMake(label.frame.size.width, sizeMax);
         let expectSize = label.sizeThatFits(maximumLabelSize)
         label.frame = CGRectMake(label.frame.origin.x, label.frame.origin.y, expectSize.width, expectSize.height)
    }
    

    此解决方案适用于多行:

    在阅读了几篇文章之后,我需要一个能够自动缩放文本并将行数调整到给定标签大小内的最佳匹配的函数,我自己编写了一个函数。(即,一根短绳可以很好地固定在一行上,并使用大量的标签框,而一根长绳可以自动拆分为2或3行,并相应地调整大小)

    您可以随意重复使用它,并根据需要进行调整。确保在
    viewdilayoutsubviews
    完成后调用它,以便设置初始标签框

    + (void)setFontForLabel:(UILabel *)label withMaximumFontSize:(float)maxFontSize andMaximumLines:(int)maxLines {
        int numLines = 1;
        float fontSize = maxFontSize;
        CGSize textSize; // The size of the text
        CGSize frameSize; // The size of the frame of the label
        CGSize unrestrictedFrameSize; // The size the text would be if it were not restricted by the label height
        CGRect originalLabelFrame = label.frame;
    
        frameSize = label.frame.size;
        textSize = [label.text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize: fontSize]}];
    
        // Work out the number of lines that will need to fit the text in snug
        while (((textSize.width / numLines) / (textSize.height * numLines) > frameSize.width / frameSize.height) && (numLines < maxLines)) {
            numLines++;
        }
    
        label.numberOfLines = numLines;
    
        // Get the current text size
        label.font = [UIFont systemFontOfSize:fontSize];
        textSize = [label.text boundingRectWithSize:CGSizeMake(frameSize.width, CGFLOAT_MAX)
                                            options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                         attributes:@{NSFontAttributeName : label.font}
                                            context:nil].size;
    
        // Adjust the frame size so that it can fit text on more lines
        // so that we do not end up with truncated text
        label.frame = CGRectMake(label.frame.origin.x, label.frame.origin.y, label.frame.size.width, label.frame.size.width);
    
        // Get the size of the text as it would fit into the extended label size
        unrestrictedFrameSize = [label textRectForBounds:CGRectMake(0, 0, label.bounds.size.width, CGFLOAT_MAX) limitedToNumberOfLines:numLines].size;
    
        // Keep reducing the font size until it fits
        while (textSize.width > unrestrictedFrameSize.width || textSize.height > frameSize.height) {
            fontSize--;
            label.font = [UIFont systemFontOfSize:fontSize];
            textSize = [label.text boundingRectWithSize:CGSizeMake(frameSize.width, CGFLOAT_MAX)
                                                options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                             attributes:@{NSFontAttributeName : label.font}
                                                context:nil].size;
            unrestrictedFrameSize = [label textRectForBounds:CGRectMake(0, 0, label.bounds.size.width, CGFLOAT_MAX) limitedToNumberOfLines:numLines].size;
        }
    
        // Set the label frame size back to original
        label.frame = originalLabelFrame;
    }
    
    +(void)setFontForLabel:(UILabel*)标签,带有MaximumFontSize:(float)maxFontSize和MaximumLines:(int)maxLines{
    int numLines=1;
    float fontSize=maxFontSize;
    CGSize textSize;//文本的大小
    CGSize frameSize;//标签框架的大小
    CGSize unrestrictedFrameSize;//如果文本不受标签高度限制,则文本的大小
    CGRect originalLabelFrame=label.frame;
    frameSize=label.frame.size;
    textSize=[label.text size属性:@{NSFontAttributeName:[UIFont systemFo]