UILabel 不会自动收缩文本以适应标签大小

我有这个奇怪的问题,我正在处理它超过8个小时了。.根据情况,我必须动态计算 UILabels大小,
我的 UIViewController接收到一个事件,我改变了 UILabels的大小。从大到小。我的 UILabel的大小变得越来越小,我得到了正确的需要的大小,但我的 UILabel的文本保持不变,相同的字体大小等。我需要的字体变得更小,为整个文字适合 UILabel。所以问题是如何使文本符合我的标签与 autoshrinking或类似的东西?译注:

在我的 xib中,UILabels autoshrink被选中,行数也被设置为0,而且我的字符串有新的行符号(n) ,我已经选择了 Linebreakmodewordwrap。也许有人和我现在的处境一样,能帮助我?我会很感激的。

先谢谢你!

编辑: UILabel最小字体大小设置为10

163178 次浏览

以下是如何做到这一点。假设下面的 messageLabel 是您希望具有所需效果的标签。现在,试试这些简单的代码行:

    //SET THE WIDTH CONSTRAINTS FOR LABEL.
CGFloat constrainedWidth = 240.0f;//YOU CAN PUT YOUR DESIRED ONE,THE MAXIMUM WIDTH OF YOUR LABEL.
//CALCULATE THE SPACE FOR THE TEXT SPECIFIED.
CGSize sizeOfText=[yourText sizeWithFont:yourFont constrainedToSize:CGSizeMake(constrainedWidth, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];
UILabel *messageLabel=[[UILabel alloc] initWithFrame:CGRectMake(20,20,constrainedWidth,sizeOfText.height)];
messageLabel.text=yourText;
messageLabel.numberOfLines=0;//JUST TO SUPPORT MULTILINING.

我认为你可以编写以下代码 在 alloc init 标签之后

UILabel* lbl = [[UILabel alloc]initWithFrame:CGRectMake(0, 10, 280, 50)];
lbl.text = @"vbdsbfdshfisdhfidshufidhsufhdsf dhdsfhdksbf hfsdh fksdfidsf sdfhsd fhdsf sdhfh sdifsdkf ksdhfkds fhdsf dsfkdsfkjdhsfkjdhskfjhsdk fdhsf ";
[lbl setMinimumFontSize:8.0];
[lbl setNumberOfLines:0];
[lbl setFont:[UIFont systemFontOfSize:10.0]];
lbl.lineBreakMode = UILineBreakModeWordWrap;
lbl.backgroundColor = [UIColor redColor];
[lbl sizeToFit];
[self.view addSubview:lbl];

它与我工作很好,使用它

你可以这样写

UILabel *reviews = [[UILabel alloc]initWithFrame:CGRectMake(14, 13,270,30)];//Set frame
reviews.numberOfLines=0;
reviews.textAlignment = UITextAlignmentLeft;
reviews.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:12];
reviews.textColor=[UIColor colorWithRed:0.0/255.0 green:0.0/255.0 blue:0.0/255.0 alpha:0.8];
reviews.backgroundColor=[UIColor clearColor];

你可以计算这样的行数

CGSize maxlblSize = CGSizeMake(270,9999);
CGSize totalSize = [reviews.text sizeWithFont:reviews.font
constrainedToSize:maxlblSize lineBreakMode:reviews.lineBreakMode];


CGRect newFrame =reviews.frame;
newFrame.size.height = totalSize.height;
reviews.frame = newFrame;


CGFloat reviewlblheight = totalSize.height;


int lines=reviewlblheight/12;//12 is the font size of label

UILabel *lbl=[[UILabel alloc]init];
lbl.frame=CGRectMake(140,220 , 100, 25);//set frame as your requirement
lbl.font=[UIFont fontWithName:@"Arial" size:20];
[lbl setAutoresizingMask:UIViewContentModeScaleAspectFill];
[lbl setLineBreakMode:UILineBreakModeClip];
lbl.adjustsFontSizeToFitWidth=YES;//This is main for shrinking font
lbl.text=@"HelloHelloHello";

希望这对你有所帮助: -) 等待你的回复

如果 numberOfLines > 1不工作 我的所作所为造成了这样的情况

if(lblRecLocation.text.length > 100)
lblRecLocation.font = [UIFont fontWithName:@"app_font_name" size:10];

最后我没有找到答案。我觉得自动心理医生不适合多条线。我最终在这个链接中使用了建议: 多行 UILabel 上的自动收缩

The solutions is to calulate text height at given width and if text is bigger, to shrink font size and then do he same again until the height is equal or less than your needed size.

我不明白为什么这么难实施。如果我遗漏了什么,欢迎大家来纠正我:)

如果你还在寻找更好的解决方案,我想这就是你想要的:

一个布尔值,指示是否应减小字体大小,以便将标题字符串放入标签的边框中(此属性仅在 numberOfLines属性设置为1时有效)。

当设置此属性时,也必须设置 minimumScaleFactor(默认值为0.5)。

斯威夫特

var adjustsFontSizeToFitWidth: Bool { get set }

目标 C

@property(nonatomic) BOOL adjustsFontSizeToFitWidth;

一个布尔值,指示是否应调整字母之间的间距以适应标签边界矩形内的字符串。

斯威夫特

var allowsDefaultTighteningForTruncation: Bool { get set }

目标 C

@property(nonatomic) BOOL allowsDefaultTighteningForTruncation;

来源

在 iOS6中,minimumFontSize已被弃用。

因此使用 minimumScaleFactor代替 minmimumFontSize

lbl.adjustsFontSizeToFitWidth = YES
lbl.minimumScaleFactor = 0.5

Swift 5

lbl.adjustsFontSizeToFitWidth = true
lbl.minimumScaleFactor = 0.5

我的解决方案也是布尔型的 label.adjsFontSizeToFitWidth = YES; 但是,你必须在 Interface Builder 中把换字键切换到“ 夹子”。 那就自动缩小标签,这很重要。

两年过去了,这个问题依然存在。

在 iOS 8/XCode 6.1中,我有时会发现我的 UILabel(在 UITableViewCell中创建,打开了 AutoLayout,并且有灵活的约束,因此有足够的空间)无法调整自身大小以适应文本字符串。

与前几年一样,解决方案是设置文本,并且 那么调用 sizeToFit

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
. . .
cell.lblCreatedAt.text = [note getCreatedDateAsString];
[cell.lblCreatedAt sizeToFit];
}

(叹气)

这就是我如何在 iOS 9.2,Xcode 7.2中获得 UILabel Autoshrink工作的方法(特别是在4s 设备中使用来自6s Plus Storyboard 的标签字体高度)。

enter image description here

  • 行数为0
  • 断行: 剪辑
  • 自动收缩: 最小字体缩放0.25

在 iOS9中,我只需要:

  1. 从标签的左侧和右侧向 Superview 添加约束。
  2. 在 IB 中将换行模式设置为剪辑。
  3. 在 IB 中将行数设置为1。

有人建议将行数设置为0,但对我来说,这只是让标签去多行..。

这适用于运行 Xcode 8.2.1(8C1002)的 Swift 3

我发现的最好的解决方案是在你的故事板或者标签上设置一个固定的宽度。将约束条件设置为边距。在 viewDidLoad 中添加以下代码行:

override func viewDidLoad() {
super.viewDidLoad()


label.numberOfLines = 1
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.5
}

label constraints to margin

fixed width label constraints to margin

attributes inspector

这就像一个魅力,它不溢出到一个新的行,并缩小文本,以适应宽度的标签没有任何怪异的问题,工程在 Swift 3。

在 Swift 3(程序设计)中,我不得不这样做:

let lbl = UILabel()
lbl.numberOfLines = 0
lbl.lineBreakMode = .byClipping
lbl.adjustsFontSizeToFitWidth = true
lbl.minimumScaleFactor = 0.5
lbl.font = UIFont.systemFont(ofSize: 15)

在 Swift 4及以上版本:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200.0, height: 200.0))
label.adjustsFontSizeToFitWidth = true
label.numberOfLines = 0
    

label.text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
    

view.addSubview(label)

这是一个很好的问题,因为现在看起来这是内置 UIKit功能或相关框架的一部分。下面是这个问题的一个很好的视觉例子:

Font resizing animation

虽然没有捷径,但绝对有可能。这样做的一种方法是通过编程尝试不同的字体大小,直到找到与视图边界相当接近的字体大小。您可以使用 NSStringNSAttributedStringboundingRect()函数来实现这一点。例如:

let string = "This is a test"
let infiniteSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height:CGFloat.greatestFiniteMagnitude)
let size = string.boundingRect(with: infiniteSize, options: [], attributes: [.font: UIFont.systemFont(ofSize: avgSize)] context: nil).size

您可以进行二进制搜索,以便比完全的蛮力搜索更有效率。还有一些更复杂的考虑,包括正确的字包装和 iOS 字体缓存性能,如果您正在寻找一些真正健壮的东西。

如果您只关心以一种简单的方式在屏幕上显示文本,那么我已经在 Swift 中开发了一个健壮的实现,我也在一个生产应用程序中使用它。它是一个 UIView子类,可以对任何输入文本(包括多行)进行高效、自动的字体缩放。要使用它,你只需要这样做:

let view = AKTextView()
// Use a simple or fancy NSAttributedString
view.attributedText = .init(string: "Some text here")
// Add to the view hierarchy somewhere

就是它! 你可以在这里找到完整的来源: https://github.com/FlickType/AccessibilityKit

希望这个能帮上忙!

Swift 4 Xcode 9.4.1

对我有效的解决办法是: 我有一个 集合视图单元格中的标签,和标签文字正在修剪。 在情节串连板上设置如下属性

Lines = 0
LineBreak = Word Wrap
Set yourlabel's leading and trailing constraint = 0 (using Autolayout)