在Swift中计算行数

时间:2014-11-24 21:59:18

标签: swift

Apple的Text Layout Programming Guide包含以下Objective-C代码片段,用于计算NSString中的行数。

NSString *string;
unsigned numberOfLines, index, stringLength = [string length];
for (index = 0, numberOfLines = 0; index < stringLength; numberOfLines++)
    index = NSMaxRange([string lineRangeForRange:NSMakeRange(index, 0)]);

Swift等价物使用原生字符串会是什么?

2 个答案:

答案 0 :(得分:1)

这是我找到的问题的解决方案,所以我会留在这里以防其他人觉得它有用。

var text = "Line 1\nLine 2\nLine 3"
for var range = text.startIndex...text.startIndex; range.endIndex < text.endIndex;
        range = range.endIndex..<range.endIndex {
    range = text.lineRangeForRange(range)
}

答案 1 :(得分:0)

这里(只是您发布的指南的简单翻译):

func countLines(textView: UITextView) -> Int {
    let layoutManager = textView.layoutManager
    var numberOfLines = 0
    var index = 0
    var lineRange = NSRange()
    var numberOfGlyphs = layoutManager.numberOfGlyphs
    for(numberOfLines, index; index < numberOfGlyphs; numberOfLines++){
        layoutManager.lineFragmentRectForGlyphAtIndex(index, effectiveRange: &lineRange)
        index = NSMaxRange(lineRange);
    }
    return numberOfLines
}

或者,如果您需要文本代码中的特定范围(像我一样):

func countLinesInRange(textView: UITextView, range: NSRange) -> Int{
    let layoutManager = textView.layoutManager
    var numberOfLines = 0
    var index = range.location
    var lineRange = range
    var numberOfGlyphs = layoutManager.numberOfGlyphs
    for(numberOfLines, index; index < range.location+range.length; numberOfLines++){
        layoutManager.lineFragmentRectForGlyphAtIndex(index, effectiveRange: &lineRange)
        index = NSMaxRange(lineRange);
    }
    return numberOfLines
}