根据包含的文本设置 UILabel 的行数 - Objective C 和/或 Swift

Posted

技术标签:

【中文标题】根据包含的文本设置 UILabel 的行数 - Objective C 和/或 Swift【英文标题】:Set UILabel's number of lines depending by the text contained - Objective C and/or Swift 【发布时间】:2014-10-25 14:25:49 【问题描述】:

我试图在UILabel 中显示一些随机文本,当然除了它的宽度我什么都没有。有没有办法根据其中包含的文本设置我的UILabel 的高度和/或行数?

谢谢 ;)

【问题讨论】:

行数为什么不用0? 也许这个tutorial 可以帮助你——它是关于具有动态高度的表格单元格,但我认为你可以将这个概念转化为你正在做的任何事情。如果您正在处理自动布局,这会很有帮助 可能对你有帮助:- ***.com/questions/9181368/ios-dynamic-sizing-labels 【参考方案1】:
myUILabel.numberOfLines = 0;
myUILabel.text = @"Pass random text here";
[myUILabel sizeToFit];

【讨论】:

感谢您的信息。这真的很容易,这就是我投票的原因。请为高度的问题写出更多描述性和具体的答案。 myUILabel.frame.size.height 而且你不得不提到语句 [myUILabel sizeToFit];必须是最后一个。【参考方案2】:

或者(如果你需要特定宽度和字体大小的标签高度,你可以用这个来计算):

func getStringHeight(mytext: String, fontSize: CGFloat, width: CGFloat)->CGFloat 

    let font = UIFont.systemFontOfSize(fontSize)
    let size = CGSizeMake(width,CGFloat.max)
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineBreakMode = .ByWordWrapping;
    let attributes = [NSFontAttributeName:font,
        NSParagraphStyleAttributeName:paragraphStyle.copy()]

    let text = mytext as NSString
    let rect = text.boundingRectWithSize(size, options:.UsesLineFragmentOrigin, attributes: attributes, context:nil)
    return rect.size.height  

对于 Swift 或 Objective C,您需要这个吗?

【讨论】:

【参考方案3】:

你可以使用NSString UIKIT Addition方法

- (CGSize)sizeWithFont:(UIFont *)font
     constrainedToSize:(CGSize)size
         lineBreakMode:(NSLineBreakMode)lineBreakMode

计算高度。类似的东西。

CGSize yourLabelSize = [@"Your very long text" sizeWithFont:yourFont constrainedToSize:CGSizeMake(desiredMaximumWidth, 2000) lineBreakMode:NSLineBreakByWordWrapping];

了解constrainedToSize 参数非常重要。你必须通过CGSizedesired maximum 宽度和maximum possible height。使用与您的标签相同的UIFont。不要忘记设置

[yourLabel setNumberOfLines:0];

但该方法已在 iOS 7 中被弃用,因此您必须使用

- (CGRect)boundingRectWithSize:(CGSize)size
                       options:(NSStringDrawingOptions)options
                    attributes:(NSDictionary *)attributes
                       context:(NSStringDrawingContext *)context

yourLabelSize.height 会给你身高

希望对你有帮助...

【讨论】:

【参考方案4】:

对于 Swift 4.0

func getStringHeight(mytext: String, fontSize: CGFloat, width: CGFloat)->CGFloat 

    let font = UIFont.systemFont(ofSize: fontSize)
    let size = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineBreakMode = .byWordWrapping;
    let attributes = [NSAttributedStringKey.font:font,
                      NSAttributedStringKey.paragraphStyle:paragraphStyle.copy()]

    let text = mytext as NSString
    let rect = text.boundingRect(with: size,
                                options:.usesLineFragmentOrigin,
                                attributes: attributes,
                                context:nil)
    return rect.size.height

【讨论】:

【参考方案5】:
let l = UILabel()
l.numberOfLines = 0
l.layer.frame.size.width = self.view.frame.width - 40 /*padding(20 + 20)*/

l.font = UIFont(name: "BwModelica-Bold", size: 16.0)

l.text = "Random Any length Text!!"

let noOfLines = ceil(l.intrinsicContentSize.width) / l.frame.width)

let lbl_height = noOfLines * l.intrinsicContentSize.height

这将是您的标签的确切动态高度和行数。编码愉快!!!

【讨论】:

以上是关于根据包含的文本设置 UILabel 的行数 - Objective C 和/或 Swift的主要内容,如果未能解决你的问题,请参考以下文章

UILabel 需要 setNumberOfLines 以适合我的文本大小

动画改变 UILabel 的行数

计算动态UILabel的行数(iOS7)

如何防止`UILabel`的文本顶部根据行数或截断而改变?

当 UITableViewCell 中的行数固定时,UILabel 占用空间?

AutoLayout 将 UILabel 高度设置为零