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

Ios 如何在swift中防止标签中出现孤儿?,ios,string,swift,uilabel,Ios,String,Swift,Uilabel,我有一个标签,可以有一个或两行。如果它有两行,我希望第二行至少有两个(或者三个)单词,而不是一个。关于如何使用swift实现这一点,有什么想法吗 提前谢谢 丹尼尔 编辑:我删掉了我愚蠢的第一个想法,但这些想法并没有真正起到作用。好吧,在环顾四周之后,我想出了我认为最好的解决方案 我写了这个函数: func numberOfLinesInLabelForText(text: String) -> Int { let attributes = [NSFontAttributeName

我有一个标签,可以有一个或两行。如果它有两行,我希望第二行至少有两个(或者三个)单词,而不是一个。关于如何使用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(uiFontTextStyleHeading)
部分,但您可以将其更改为标签使用的字体和大小。 然后我使用
(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)
    }
}
我决定在最接近其一半的断点处将字符串一分为二,而不仅仅是避免孤立,所以这就是最后一个函数的作用,但是调整它以满足您的需要并不困难


就在这里

我认为你发布的代码不是重点。如何计算句子的转折点是你的问题中最难的部分,我想这是在FXLable_ispunchuation中实现的。@zhongdian好吧,从我所能收集到的信息来看,我认为这部分只是检查单词是否是标点字符:
-(BOOL)FXLabel_ispunchuation{return[[NSSet setWithObjects:@“-”,//hyphen@”-“,//en-dash@-”,//em-dash@”;“,@:”,nil]包含对象:self];}
整个代码都在这里:有没有办法检查字符串在哪里/将在哪里断开?我的意思是,在它断开后但在它呈现之前访问它。然后我们可以检查它的断开点后是否只有一个单词,然后我们可以将断开点移回一两个单词。在我看来,最困难的部分是找到原语最后一个断点。这是一个愚蠢的方法。将UILabel的UILineBreakMode设置为UILineBreakModeWordWrap,然后调用SizeWithatAttributes。切掉最后一个单词,再次调用SizeWithatAttributes。比较两个不同的CGSize。如果高度不一样,则强制换行。应该有效。@zhongdian,嗯,这很有创意。我会研究它,thanks!