如何使用新的 iOS 7 API 获取自动换行信息?
Posted
技术标签:
【中文标题】如何使用新的 iOS 7 API 获取自动换行信息?【英文标题】:How do I get word wrap information with the new iOS 7 APIs? 【发布时间】:2013-11-05 04:38:25 【问题描述】:我注意到 ios 7 引入了与文本布局相关的新类,例如 NSLayoutManager、NSTextStorage 和 NSTextContainer。如何使用这些来获取有关 NSString 上的自动换行的信息?
例如,假设我有一个很长的 NSString,我将它放在 UILabel 中。如果我在 UILabel 上启用多行,它将生成如下字符串:
The quick brown fox jumps
over the lazy dog.
这很好,但我无法访问代码中的换行符(例如,在 jumps
这个词之后,我希望它返回 \n
或类似的东西)。我想知道换行符发生在哪些字符索引处。我知道we can do this with CoreText,但是由于我们在 iOS 7 中有这些新类,我想知道我们可以如何使用它们。
【问题讨论】:
【参考方案1】:例子:
CGFloat maxWidth = 150;
NSAttributedString *s =
[[NSAttributedString alloc]
initWithString:@"The quick brown fox jumped over the lazy dog."
attributes:@NSFontAttributeName:[UIFont fontWithName:@"GillSans" size:20]];
NSTextContainer* tc =
[[NSTextContainer alloc] initWithSize:CGSizeMake(maxWidth,CGFLOAT_MAX)];
NSLayoutManager* lm = [NSLayoutManager new];
NSTextStorage* tm = [[NSTextStorage alloc] initWithAttributedString:s];
[tm addLayoutManager:lm];
[lm addTextContainer:tc];
[lm enumerateLineFragmentsForGlyphRange:NSMakeRange(0,lm.numberOfGlyphs)
usingBlock:^(CGRect rect, CGRect usedRect,
NSTextContainer *textContainer,
NSRange glyphRange, BOOL *stop)
NSRange r = [lm characterRangeForGlyphRange:glyphRange actualGlyphRange:nil];
NSLog(@"%@", [s.string substringWithRange:r]);
];
【讨论】:
看来你也应该包含tc.lineFragmentPadding = 0
这行,否则它不会与UILabel正确对齐。
我正在寻找这个,但也许我错过了一些东西。我实际上无法访问此信息。 NSLog 输出在 enumeratedLineFragmentsForGlyphRange 内。 lats 说,我似乎无法将每一行转移到一个数组中。想法?【参考方案2】:
快速翻译:
guard let font1: UIFont = textView.font else return
var lines: [String] = []
let maxWidth: CGFloat = textView.frame.width
let s: NSAttributedString = NSAttributedString.init(string: textView.text, attributes: [.font: font1])
let tc: NSTextContainer = NSTextContainer.init(size: CGSize(width: maxWidth, height: CGFloat.greatestFiniteMagnitude))
let lm: NSLayoutManager = NSLayoutManager.init()
let tm: NSTextStorage = NSTextStorage.init(attributedString: s)
tm.addLayoutManager(lm)
lm.addTextContainer(tc)
lm.enumerateLineFragments(forGlyphRange: NSRange(location: 0, length: lm.numberOfGlyphs)) (rect: CGRect, usedRect: CGRect, textContainer: NSTextContainer, glyphRange: NSRange, Bool) in
let r: NSRange = lm.characterRange(forGlyphRange: glyphRange, actualGlyphRange: nil)
let str = s as NSAttributedString
let s2 = str.attributedSubstring(from: r)
print(s2)
lines.append(s2.string)
【讨论】:
以上是关于如何使用新的 iOS 7 API 获取自动换行信息?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 7 中使用 iBeacons 获取设备详细信息,如 UUID 或设备名称