如何计算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)中的行数?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C:将图像从文件复制到设备粘贴板

如何创建符合 Swift 和 Objective-C 之间共享协议的类方法?

如何在 Objective-C 中将字符串转换为整数? [复制]

如何在 Xcode(Objective-c)上的 URL 中连接字符串?

如何在 Objective-C 中使用 Swift 字符串枚举?

如何在 C / Objective-C 中将字符串文字拆分为多行?