根据包含的文本设置 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
参数非常重要。你必须通过CGSize
和desired 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 以适合我的文本大小