【问题标题】:Height required for UILabel dependent on string length (Swift, iOS 8)UILabel 所需的高度取决于字符串长度(Swift,iOS 8)
【发布时间】:2014-08-02 11:13:34
【问题描述】:

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

【问题讨论】:

    标签: nsstring swift uilabel ios8


    【解决方案1】:

    两个观察。首先,您的代码有什么问题是这一行不是 Swift:

    let attributes = [NSFontAttributeName: [UIFont.systemFontOfSize(16.0)]]
    

    等号后面的内容是 Objective-C,Swift 无法解释它。删除UIFont 调用周围的方括号;你已经把它变成了一个数组,这是你看到的错误的来源。

    其次,更重要的是,有许多更简单的方法可以做到这一点,让标签告诉您所需文本的大小:

    • 将文字放入标签中,并在标签上调用sizeToFit()

    • 将文字放入标签中,在标签上调用sizeThatFits(),需要的宽高大。

    • 在自动布局下,将标签的preferredMaxLayoutWidth设置为所需的宽度,并将文本放入标签中;它会自行调整大小。

    但是,如果您不必这样做,我会敦促您不要这样做。标签已经在自动布局下自动调整大小,并且在 iOS 8 中有一个新功能,表格单元格将根据其内容自行调整其高度,因此现在很少需要预先测量标签的尺寸。

    【讨论】:

    • 这个答案很好,很感激@matt。使用您的最后一条语句,是否可以提供一个示例项目,以显示一个非常简单的自我调整示例。我是 iOS 编程新手,这会很有帮助。谢谢!
    • 我刚刚测试了您为我的项目提供的代码,它运行良好。我非常感谢@matt。 +1
    • 我有类似的问题,我正在尝试显示两列文本,并且文本是动态的,具体取决于用户选择的子视图。我已经尝试过 sizeThatFits() 并定义了一个设定的宽度和较大的高度,但从未强制执行宽度。有什么建议吗?
    【解决方案2】:

    将文本放入标签中,并在标签上调用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-22
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多