【发布时间】:2014-05-08 12:53:01
【问题描述】:
我正在尝试使用 NSTextContainer 的 excludePaths 在 UITextView 中排除一个正方形,如下所示:
NSTextStorage* textStorage = [[NSTextStorage alloc] initWithAttributedString:attributedString];
NSLayoutManager *layoutManager = [NSLayoutManager new];
[textStorage addLayoutManager:layoutManager];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:self.bounds.size];
UIBezierPath *rectanglePath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 250, 250)];
textContainer.exclusionPaths = @[rectanglePath];
[layoutManager addTextContainer:textContainer];
self.textView = [[UITextView alloc] initWithFrame:self.bounds textContainer:textContainer];
self.textView.editable = NO;
self.textView.scrollEnabled = NO;
[self addSubview:self.textView];
这在 iOS 7.0 中运行良好:
然而,在 iOS 7.1 中,这将导致 NSTextContainer 的 lineFragmentRectForProposedRect:atIndex:writingDirection:remainingRect: 某处出现无限循环,占用 99% 的 CPU 并疯狂地泄漏内存。该应用程序完全没有响应,最终由于内存使用而终止。显然这是 iOS 7.1 中的一个错误。
当我将排除矩形的 x 原点更改一个点(原点为 {1,0})时,它可以工作,但看起来很糟糕:
该错误似乎仅在第一行的第一个字符受排除矩形影响时发生。当我将排除矩形更改为 {0,30} 时,它也可以工作:
但这显然不是我想要的。有谁知道我可以如何解决这个错误?
【问题讨论】:
-
经过进一步调查,这个错误似乎是由字体引起的。在我的示例中,我使用的是“HelveticaNeue-Light”。切换到“Helvetica”解决了这个问题。现在我更加困惑了。
标签: ios objective-c textkit nstextcontainer