如何防止 swift 中的标签中出现孤儿?

How can I prevent orphans in a label in swift?

我有一个可以有一行或两行的标签。如果它有两行,我希望第二行至少有两个(或三个)单词,而不仅仅是一个。关于如何使用 swift 完成此操作的任何想法?

提前致谢!

丹尼尔

编辑:我删除了我愚蠢的第一个想法,这些想法并没有真正帮助。

好的,在四处寻找之后,我想出了我认为最好的解决方案。

我写了这个函数:

func numberOfLinesInLabelForText(text: String) -> Int {

    let attributes = [NSFontAttributeName : UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)]
    let screenSize: CGRect = UIScreen.mainScreen().bounds
    let labelSize = text!.boundingRectWithSize(CGSizeMake((screenSize.width - 30), CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: attributes, context: nil)

    let lines = floor(CGFloat(labelSize.height) / bookTitleLabel.font.lineHeight)
    return Int(lines)
}

您输入将显示在标签中的字符串,它会告诉您标签将包含多少行。我为此特定标签使用动态类型和标题样式,因此使用 preferredFontForTextStyle(UIFontTextStyleHeadline) 部分,但您可以将其更改为标签使用的字体和大小。 然后我使用 (screenSize.width - 30) 作为标签的宽度,因为它的宽度不固定,所以我使用屏幕尺寸减去前导和尾随。这可能不是最优雅的解决方案,我愿意接受更好的建议。 剩下的就很简单了。

得到行数后,我可以这样做:

func splittedString(text: String) -> String {

    if numberOfLinesInLabel(text) == 2 {
        var chars = Array(text.characters)
        var i = chars.count / 2
        var x = chars.count / 2
        while chars[i] != " " && chars[x] != " " {
            i--
            x++
        }
        if chars[i] == " " {
            chars.insert("\n", atIndex: i+1)
        } else {
            chars.insert("\n", atIndex: x+1)
        }
        return String(chars)
    }
}

我决定在最接近其一半的断点处将字符串一分为二,而不是仅仅避免孤儿,这就是最后一个函数所做的,但调整它以满足您的需要并不难。

给你!