UILabel 自动收缩并在必要时使用 2 行

Posted

技术标签:

【中文标题】UILabel 自动收缩并在必要时使用 2 行【英文标题】:UILabel autoshrink and use 2 lines if necessary 【发布时间】:2015-06-17 13:40:20 【问题描述】:

我有一个 UILabel,如果可能的话,我想先缩小文本以适合单行。如果这不起作用,我希望它最多使用两行。这可能吗?

目前我的设置是这样的:

这是我的布局

如果我将行设置更改为 1 行,文本会缩小。

【问题讨论】:

【参考方案1】:

我想出了一个解决方案。

    将“线”设置为 2 将“换行符”设置为“截断尾部” 将“Autoshrink”设置为“Minimum Font Scale”,并将值设置为 0.1(或者您希望它有多小) (可选)选中“收紧字母间距”

下一部分是代码。我继承了 UILabel 并想出了这个。

#import <UIKit/UIKit.h>

@interface HMFMultiLineAutoShrinkLabel : UILabel

- (void)autoShrink;

@end

.

#import "HMFMultiLineAutoShrinkLabel.h"

@interface HMFMultiLineAutoShrinkLabel ()

@property (readonly, nonatomic) UIFont* originalFont;

@end

@implementation HMFMultiLineAutoShrinkLabel

@synthesize originalFont = _originalFont;

- (UIFont*)originalFont  return _originalFont ? _originalFont : (_originalFont = self.font); 

- (void)autoShrink 
    UIFont* font = self.originalFont;
    CGSize frameSize = self.frame.size;

    CGFloat testFontSize = _originalFont.pointSize;
    for (; testFontSize >= self.minimumScaleFactor * self.font.pointSize; testFontSize -= 0.5)
    
        CGSize constraintSize = CGSizeMake(frameSize.width, MAXFLOAT);
        CGRect testRect = [self.text boundingRectWithSize:constraintSize
                                                       options:NSStringDrawingUsesLineFragmentOrigin
                                                    attributes:@NSFontAttributeName:font
                                                       context:nil];
        CGSize testFrameSize = testRect.size;
        // the ratio of testFontSize to original font-size sort of accounts for number of lines
        if (testFrameSize.height <= frameSize.height * (testFontSize/_originalFont.pointSize))
            break;
    

    self.font = font;
    [self setNeedsLayout];


@end

然后,当您更改标签的文本时,只需调用 autoShrink,它的大小就会正确,并且只有在必要时才会走两两行。

我从 john.k.doe 对这个问题 (https://***.com/a/11788385/758083) 的回答中获得了大部分代码

【讨论】:

以上是关于UILabel 自动收缩并在必要时使用 2 行的主要内容,如果未能解决你的问题,请参考以下文章

UILabel 自动收缩不起作用

单行 UILabel 拥抱不适用于自动收缩

使更改 UILabel 文本不触发自动布局

如何将 UILabel 限制为 25 个字符并在超过使用自动布局时显示点

当UITableViewCell被点击时,UILabel未按预期更新的行数

UILabel 自动布局适合