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

时间:2015-10-20 04:57:23

标签: ios string swift uilabel

我有一个可以有一两行的标签。如果它有两行,我希望第二行至少有两个(或者三个)单词,而不是一个单词。关于如何使用swift实现这一点的任何想法?

提前致谢!

丹尼尔

编辑:我编辑了我愚蠢的初步想法,这些想法并没有真正帮助。

1 个答案:

答案 0 :(得分:1)

好的,经过四处寻找,我想出了我认为最好的解决方案。

我写了这个函数:

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)
    }
}

我决定将字符串拆分为最接近其一半的断点,而不是仅仅避开孤儿,这就是最后一个函数的作用,但要根据您的需要进行调整并不困难。

你有它!