UILabel所需的高度取决于字符串长度(Swift,iOS 8)

时间:2014-08-02 11:13:34

标签: nsstring swift uilabel ios8

我正在努力获得基于可接受的可变大小文本的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开发项目。

2 个答案:

答案 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)