如何限制Swift中字符串或归因字符串中的字符数

给定是一个带有x个字符数的(html)字符串. String将格式化成一个归因的String.然后显示在UILabel.

UILabel具有> = 25和< = 50的高度,以将行数限制为2. 由于字符串的字符在格式化的归因字符串中不可见,如< b> /< i>,最佳方法是限制归因的字符串的字符数.

UILabel属性.lineBreakMode = .byTruncatingTail导致单词被剪切.

如果人物数量超过UILabel的空间限制,那么这个目标就是在单词间切换.所需maxCharacterCount = 50.确定maxCharacterCount之前的最后一个空格.剪切字符串并追加…作为UILabel的最后一个字符.

限制角色的最佳方法是什么?帮助非常欣赏.

从整个字符串和已知的两行标签高度及其已知宽度开始,并将字符从字符串的末尾继续保留,直到字符串的高度小于标签的高度.然后再剪一个字,以达到最佳效果,追加省略号,并将生成的字符串放入标签中.

这样我就得到了:

注意“时间”之后的词从不开始;我们用插入的省略号在精确的字尾停止.这是我这样做的:

lab.numberOfLines = 2
    let s = "Little poltergeists make up the principle form of material " +
        "manifestation. Now is the time for all good men to come to the " +
        "aid of the country."
    let atts = [NSFontAttributeName: UIFont(name: "Georgia",size: 18)!]
    let arr = s.components(separatedBy: " ")
    for max in (1..<arr.count).reversed() {
        let s = arr[0..<max].joined(separator: " ")
        let attrib = NSMutableAttributedString(string: s,attributes: atts)
        let height = attrib.boundingRect(with: CGSize(width:lab.bounds.width,height:10000),options: [.usesLineFragmentOrigin],context: nil).height
        if height < lab.bounds.height {
            let s = arr[0..<max-1].joined(separator: " ") + "…"
            let attrib = NSMutableAttributedString(string: s,attributes: atts)
            lab.attributedText = attrib
            break
        }
    }

当然,对于什么构成一个“单词”和在测量的条件来说,这是可以复杂得多的,但是上面的例子显示了这种事情的一般常用技术,并且足以让你开始.

相关文章

Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章。自从苹果发布 Swfit 编程语言,就成为了...
快,快,快!动动您的小手,分享给更多朋友! 苹果去年推出了全新的编程语言Swift,试图让iOS开发更简单...
开发者(KaiFaX) 面向开发者、程序员的专业平台! 和今年年初承诺的一样,苹果贴出了Swift语言的源码,...
本文由@Chun发表于Chun Tips :http://chun.tips/blog/2014/12/11/shi-yong-swift-gou-jian-zi-ding-yi...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...