UILabel 截尾并跳过不完整的单词

UILabel truncate tail and skip not complete word

我只有一行UILabel。它的宽度 = 屏幕宽度,现在的内容是(UILabel 的内容可以更改)

You have 30 seconds to make an impression during an interview

目前,我的UILabel被截断了尾巴,单词"duration"不完整

self.nameLabel.lineBreakMode = NSLineBreakByTruncatingTail;

我想要的是我想要我的UILabel仍然截断尾部并且显示完整的单词。
喜欢下图

如有任何帮助或建议,我们将不胜感激。

理想情况下,这是不可能的,使用默认的 UILabel,当您将 lineBreakMode 设置为 TruncatingTail 时,根据 letter/word 所需的 space,OS 将截断它,一种解决方案要解决此问题,您可以根据匹配情况使用以下属性。

Minimum Font Scale -- 使用此 属性 指定当前字体大小的最小乘数,在显示标签文本时产生可接受的字体大小.如果为此 属性 指定值 0,则使用当前字体大小作为最小字体大小。

最小字体大小 -- 当绘制的文本可能不适合标签的边界矩形时,您可以使用此 属性 来防止接收器缩小将字体大小调整到无法辨认的程度。

我不确定,但试试看:

nameLabel.adjustsFontSizeToFitWidth = NO;
nameLabel.lineBreakMode = NSLineBreakByWordWrapping;

如果您使用的是情节提要,请按照以下步骤操作,我试过了并且效果很好

  • 打开属性检查器
  • 将换行符改为截尾然后

  • 将自动收缩更改为最小字体大小

这是我在应用这些属性前后的标签截图

新输出

你可以这样做:

let labelWidth = CGRectGetWidth(label.bounds)

    let str = "You will have 30 seconds till you give us a good impression" as NSString
    let words = str.componentsSeparatedByString(" ")

    var newStr = "" as NSString

    for word in words{

        let statement = "\(newStr) \(word) ..." as NSString
        let size = statement.sizeWithAttributes([NSFontAttributeName:label.font])
        if size.width < labelWidth {
            newStr = "\(newStr) \(word)"
        }
        else{
           break
        }
    }

    newStr = newStr.stringByAppendingString(" ...")

    self.label.text = newStr as String

想法是:我们拆分单词并尝试检查宽度,同时从开头附加字符串“...”,直到我们找到一个将超过大小的单词,如果我们停止并使用这个新的字符串