如何查找UITextView行数

时间:2011-09-06 13:04:48

标签: iphone objective-c ios

我必须找到UITextView的行数。 numberOfLines上没有可用的属性,例如UITextView。我使用以下公式,但它不起作用。有人对此有所了解吗?

int numLines = txtview.contentSize.height/txtview.font.lineHeight;

3 个答案:

答案 0 :(得分:19)

如果您使用的是iOS 3,则需要使用leading属性:

int numLines = txtview.contentSize.height / txtview.font.leading;

如果您使用的是iOS 4,则需要使用lineHeight属性:

int numLines = txtview.contentSize.height / txtview.font.lineHeight;

而且,正如@thomas指出的那样,如果你需要一个确切的结果,要小心四舍五入。

答案 1 :(得分:1)

您可以查看UITextView的contentSize属性以获取其高度 以像素为单位的文本,除以UITextView字体的行间距即可得到 UIScrollView总数(打开和关闭屏幕)中的文本行数,包括换行和换行文本。

int numLines = txtview.contentSize.height/txtview.font.leading;

答案 2 :(得分:1)

Swift 4 使用UITextView计算UITextInputTokenizer中的行数的方式:

public extension UITextView {
    /// number of lines based on entered text
    public var numberOfLines: Int {
        guard compare(beginningOfDocument, to: endOfDocument).same == false else {
            return 0
        }
        let direction: UITextDirection = UITextStorageDirection.forward.rawValue
        var lineBeginning = beginningOfDocument
        var lines = 0
        while true {
            lines += 1
            guard let lineEnd = tokenizer.position(from: lineBeginning, toBoundary: .line, inDirection: direction) else {
                fatalError()
            }
            guard compare(lineEnd, to: endOfDocument).same == false else {
                break
            }
            guard let newLineBeginning = tokenizer.position(from: lineEnd, toBoundary: .character, inDirection: direction) else {
                fatalError()
            }
            guard compare(newLineBeginning, to: endOfDocument).same == false else {
                return lines + 1
            }
            lineBeginning = newLineBeginning
        }
        return lines
    }
}

public extension ComparisonResult {

    public var ascending: Bool {
        switch self {
        case .orderedAscending:
            return true
        default:
            return false
        }
    }

    public var descending: Bool {
        switch self {
        case .orderedDescending:
            return true
        default:
            return false
        }
    }

    public var same: Bool {
        switch self {
        case .orderedSame:
            return true
        default:
            return false
        }
    }
}