获取行数UITextView而不使用" \ n"?

时间:2015-04-22 07:42:45

标签: ios swift uitextview

我有一个textView,我需要行数,或者sizeToFit才变成sizeToFit。我已经尝试在textView中检查换行符的数量“\ n”。然而,textView中的文本已经被解析了bc它是非常混乱的来自服务器有大量的html代码和可怕的换行符,我不得不使用“\ n”的replaceOccurence来删除换行符以使文本成为一个好段落。

var rawString = self.selectedProduct.description   
var cleanString = rawString?.stringByReplacingOccurrencesOfString("\n", withString: " ", options: NSStringCompareOptions.LiteralSearch, range: nil)

此代码当然只会在上述代码后返回1。

let desString = self.descriptionTextView.text
let numLines = desString.componentsSeparatedByString("\n")
println(numLines.count)

这段代码崩溃了。

 let numLines = self.descriptionTextView.contentSize.height / self.descriptionTextView.font.leading

最终,我想要部分显示文字,并有一个显示所有文字的按钮。

谢谢

1 个答案:

答案 0 :(得分:5)

我已经将@ aBilal17的评论转换为非贬值的东西并且迅速。

// This gives you the size of that string

let font = UIFont.systemFontOfSize(11)
let style = NSMutableParagraphStyle()
style.lineBreakMode = NSLineBreakMode.ByWordWrapping
let size = someString.sizeWithAttributes([NSFontAttributeName: font, NSParagraphStyleAttributeName: style])

我使用这个扩展来获得限制为宽度的字符串的大小:

extension String {
    func sizeForWidth(width: CGFloat, font: UIFont) -> CGSize {
        let attr = [NSFontAttributeName: font]
        let height = NSString(string: self).boundingRectWithSize(CGSize(width: width, height: CGFloat.max), options:.UsesLineFragmentOrigin, attributes: attr, context: nil).height
        return CGSize(width, ceil(height))
    }
}

所以在你的情况下,你可以这样做:

let numLines = desString.sizeForWidth(descriptionTextView.contentSize.width, font: descriptionTextView.font).height / descriptionTextView.font.lineHeight