NSTextContainer的exclusionPaths在iOS 7.1上导致应用程序冻结并使用99%的CPU - 有解决方法吗?

10

我正在尝试使用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中,这很正常:

with iOS 7.0

然而,在iOS 7.1中,这会导致NSTextContainer的lineFragmentRectForProposedRect:atIndex:writingDirection:remainingRect:函数无限循环,占用了99%的CPU并且像疯子一样泄漏内存。应用程序变得完全不响应,并最终由于内存使用而终止。显然,这是iOS 7.1中的一个错误。

当我将排除矩形的x原点仅更改一个点(从原来的{0,0}到{1,0})时,它可以工作,但看起来很糟糕:

with iOS 7.1 and one point to the right

只有当第一行的第一个字符受到排除矩形的影响时,才会发生此错误。当我将排除矩形更改为{0,30}时,它也可以工作:

iOS 7.1 and 0,30

但显然这不是我想要的。有人知道如何解决这个问题吗?


1
经过进一步调查,这个错误似乎是由字体引起的。在我的例子中,我使用的是“HelveticaNeue-Light”。切换到“Helvetica”可以解决问题。现在我更加困惑了。 - René
2个回答

3

我遇到了同样的问题,为了解决这个问题,我采取了以下措施:

mytextView.exclusionPaths = @[rectanglePath] 

进入 layoutSubview 方法中。 我希望这能帮助到某些人。


0

实际上,我在 iOS 7 上遇到了与属性文本相关的相同问题。

我不得不完全删除属性文本,使 UITextView 可选,以便我可以更改文本颜色和字体,然后它才能正常工作。

唉。

只是提一下,以防将来有人遇到这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接