如何计算Objective-C字符串(NSString)中的行数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何计算Objective-C字符串(NSString)中的行数?相关的知识,希望对你有一定的参考价值。
我想在Objective-C中计算NSString中的行数。
NSInteger lineNum = 0;
NSString *string = @"abcde
fghijk
lmnopq
rstu";
NSInteger length = [string length];
NSRange range = NSMakeRange(0, length);
while (range.location < length) {
range = [string lineRangeForRange:NSMakeRange(range.location, 0)];
range.location = NSMaxRange(range);
lineNum += 1;
}
有没有更简单的方法?
答案
好吧,一个不是很有效但很好看(ish)的方式
NSString *string = @"abcde
fghijk
lmnopq
rstu";
NSInteger length = [[string componentsSeparatedByCharactersInSet:
[NSCharacterSet newlineCharacterSet]] count];
斯威夫特4:
myString.components(separatedBy: .newlines)
另一答案
Apple建议使用此方法:
NSString *string;
unsigned numberOfLines, index, stringLength = [string length];
for (index = 0, numberOfLines = 0; index < stringLength; numberOfLines++)
index = NSMaxRange([string lineRangeForRange:NSMakeRange(index, 0)]);
见article。他们还解释了如何计算包装文本的行数。
另一答案
如果要考虑文本的宽度,可以使用TextKit(ios7 +)执行此操作:
func numberOfLinesForString(string: String, size: CGSize, font: UIFont) -> Int {
let textStorage = NSTextStorage(string: string, attributes: [NSFontAttributeName: font])
let textContainer = NSTextContainer(size: size)
textContainer.lineBreakMode = .ByWordWrapping
textContainer.maximumNumberOfLines = 0
textContainer.lineFragmentPadding = 0
let layoutManager = NSLayoutManager()
layoutManager.textStorage = textStorage
layoutManager.addTextContainer(textContainer)
var numberOfLines = 0
var index = 0
var lineRange : NSRange = NSMakeRange(0, 0)
for (; index < layoutManager.numberOfGlyphs; numberOfLines++) {
layoutManager.lineFragmentRectForGlyphAtIndex(index, effectiveRange: &lineRange)
index = NSMaxRange(lineRange)
}
return numberOfLines
}
以上是关于如何计算Objective-C字符串(NSString)中的行数?的主要内容,如果未能解决你的问题,请参考以下文章
如何创建符合 Swift 和 Objective-C 之间共享协议的类方法?
如何在 Objective-C 中将字符串转换为整数? [复制]
如何在 Xcode(Objective-c)上的 URL 中连接字符串?