如何布局可以有无限行数的UILabel

Posted

技术标签:

【中文标题】如何布局可以有无限行数的UILabel【英文标题】:How to layout UILabel which can have infinite number of lines 【发布时间】:2014-09-19 16:34:36 【问题描述】:

ios 中,我可以将 UILabel 行数设置为 0,因为动态行数取决于我将标签设置为的文本量。

我的问题是,如果我想在 UILabel 正下方布局 2 个按钮,我该怎么做?因为我不知道 UILabel 的高度(取决于我设置的文本,可能会有所不同),我如何将按钮放置在 UILabel 下方。以及如何调整 ScrollView 以使其在必要时滚动?

滚动视图 UILabel 用户界面按钮 用户界面按钮

【问题讨论】:

【参考方案1】:

使用自动布局并在按钮顶部和 UILabel 底部之间设置约束。

UIScrollView 可以通过编程方式进行滚动,通过验证contentSize 属性是否大于框架的大小来执行检查,然后将myScrollView.scrollEnabled 设置为true

编辑:

如果您使用 .xib 文件,则必须选择它,在“显示文件检查器”窗格的“界面生成器文档”部分中设置 Use auto layout 启用(参见照片)。

然后,在界面构建器中,选择按钮并在按钮和标签之间放置一个顶部约束(参见照片)。

编辑 2:请注意,您可能还必须添加其他约束,以便能够将元素正确放置在容器中。

另一种方法是以编程方式使用 NSLayoutConstraints。更多细节在这里:

http://www.tutorialspoint.com/ios/ios_auto_layouts.htm

【讨论】:

谢谢。在哪里设置“使用自动布局”?在我的滚动视图中?我在属性检查器中找不到。 谢谢。我在我的项目中使用“自动布局”。我正在使用故事板。我将 UILabel 'Lines' 设置为 0。在 size Inspector 中,我将宽度、高度设置为 375 和 41。但现在,只显示了 2 行文本。我猜它是由 41 作为高度限制的。我的问题是为什么 UILabel 不增加高度?因为我已将“Lines”设置为 0。再次感谢您的帮助。【参考方案2】:

用下面的方法计算标签的高度

(CGFloat)findHeightForAttributedText:(NSAttributedString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font  
  
    CGFloat result = font.pointSize+4;
    CGFloat width = widthValue;
    if (text) 
        // CGSize textSize =  width, CGFLOAT_MAX ;       //Width and height of text area
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width, 0)];
        label.font = font;
        label.numberOfLines = 0;
        label.lineBreakMode = NSLineBreakByWordWrapping;
        label.attributedText = text;
        [label sizeToFit];
        //        CGRect rect = [text boundingRectWithSize:textSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];
        result = MAX(CGRectGetHeight(label.frame), result); //At least one row
    
    return result;

你可以这样调用这个方法。

NSString *description = @"your text will go here";
    CGFloat descHeight = [NSString findHeightForAttributedText:description havingWidth:288 andFont:[UIFont fontWithName:@"HelveticaNeue-" size:16.0f]];

现在你有了文本的高度。设置文本的框架,你也可以通过在上面计算的高度上添加一些边距来设置按钮的 y。

【讨论】:

如果我创建了一个 UILabel,我可以在设置属性文本后获取对该 UILabel 的引用并调用“label.frame”以获取新高度吗? 是的,你可以这样做..github.com/sgup77/SGXmlParser .check this 作为参考。这不是您正在寻找的。但它会帮助你理解上面的代码。 我在主故事板的视图中创建了一个 UILabel。我已经将该视图绑定到我的名为 MyCell.swift 的 swift 类中,它有一个“@IBOutlet weak var myLabel: UILabel!”。我的问题是如何使用现有的 UILabel 执行 findHeightForAttributedText()。您的函数会创建一个新的 UILabel。

以上是关于如何布局可以有无限行数的UILabel的主要内容,如果未能解决你的问题,请参考以下文章

如何构建具有特定行数的表格视图?

JAVA的gridlayout如何设置不填充满

vim - 如何在不计算行数的情况下删除一大块文本?

如何在 UITableview 中创建具有 n 行数的 UITextField

如何在 NativeScript 中创建具有动态行数和列数的表?

SQL Server中关于基数估计如何计算预估行数的一些探讨