NSTextContainer exclusionPaths冻结app并在iOS 7.1上使用99%的CPU - 解决方法?

时间:2014-05-08 12:53:02

标签: ios objective-c textkit nstextcontainer

我试图使用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原点改变一个点(原点为{1,0})时,它可以工作,但看起来很糟糕:

  

with iOS 7.1 and one point to the right

当第一行的第一个字符受排除rect影响时,似乎只会发生错误。当我将排除矩形更改为{0,30}时,它也将起作用:

  

iOS 7.1 and 0,30

但显然这不是我想要的。有谁知道如何解决这个错误?

2 个答案:

答案 0 :(得分:3)

我有同样的问题,要解决这个问题:

mytextView.exclusionPaths = @[rectanglePath] 

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

答案 1 :(得分:0)

实际上我在iOS 7和属性文本中遇到了同样的事情。

我必须完全删除属性文本,使UITextView可选,这样我就可以更改文本颜色和字体,然后才有效。

叹息。

如果有人在将来偶然发现这件事,请提及这一点。