我正在努力获得基于可接受的可变大小文本的UILabel所需的高度。经过几个小时的研究,我还没有找到一种可行的方法来实现这一目标。目前我的代码如下:
func getHeightForTitle(postTitle: NSString) -> CGFloat {
// Get the height of the font
let constraintSize = CGSizeMake(self.cellTextWidth, CGFloat.max)
let attributes = [NSFontAttributeName: [UIFont.systemFontOfSize(16.0)]]
let labelSize = postTitle.boundingRectWithSize(constraintSize,
options: NSStringDrawingOptions.UsesLineFragmentOrigin,
attributes: attributes,
context: nil)
return labelSize.height
}
然而,这会引发以下错误:
2014-08-02 12:09:37.370 Testing App[8365:351906] - [_TtCSs23_ContiguousArrayStorage00007FD26C15F708 pointSize]: unrecognized selector sent to instance 0x11e640050
这总是在let labelSize = postTitle ...方法中抛出,我相信它归结为属性变量。但是我可能错了。感谢任何帮助,非常感谢!
请注意:这适用于iOS 8 Swift开发项目。
答案 0 :(得分:9)
两个观察结果。首先,你的代码有什么问题,这条线不是Swift:
let attributes = [NSFontAttributeName: [UIFont.systemFontOfSize(16.0)]]
等号后的东西是Objective-C,而Swift在解释它时遇到了麻烦。从UIFont
电话周围移除方括号;你把它变成了一个数组,这是你所看到的错误的来源。
其次,更重要的是,通过让标签告诉您所需文本的大小,有许多更简单的方法:
将文字放入标签中并拨打标签上的sizeToFit()
。
将文字放入标签中,并在标签上调用sizeThatFits()
,使其具有所需的宽度和较大的高度。
在自动布局下,将标签的preferredMaxLayoutWidth
设置为所需的宽度,并将文字放入标签中;它会自行调整大小。
但是,如果你不必,我会敦促你不要这样做。标签已经在自动布局下自动调整大小,并且在iOS 8中有一个新功能,其中表格单元格会自动调整其高度与其内容,因此现在很少需要预先测量标签和#39;尺寸。
答案 1 :(得分:0)
将文本放入标签中,并在标签上调用sizeThatFits(),使其具有所需的宽度和较大的高度。
sub_label=UILabel(frame: CGRectMake(0, 0, self.view.bounds.width, 50))
sub_label.numberOfLines=0;
sub_label.textAlignment=NSTextAlignment.Left
sub_label.lineBreakMode=NSLineBreakMode.ByWordWrapping
let subfont = UIFont(name: "Helvetica", size: 20.0)
sub_label.font=subfont
sub_label.text="his is just a load of texthis is just a load of texthis is just a load of texthis is just a load of texthis is just a load of texthis is just a load of text"
sub_label.backgroundColor=UIColor.clearColor()
var textViewSizesub=sub_label.sizeThatFits(CGSizeMake(self.view.bounds.width, CGFloat.max))
sub_label.frame=CGRectMake(0, textViewSize.height, self.view.bounds.width-5, textViewSizesub.height)