将排除路径添加到多个文本视图

时间:2013-11-20 01:56:53

标签: ios uiscrollview uitextview textkit

我试图在UITextView中连续添加一系列UIScrollView的多个排除路径,如下所示:

while (lastRenderedGlyph < self.manager.numberOfGlyphs) {
    CGRect textViewFrame = CGRectMake(currentXOffset, 10,
                                      width / 2,
                                      height - 20);
    CGSize columnSize = CGSizeMake(CGRectGetWidth(textViewFrame) - 20,
                                   CGRectGetHeight(textViewFrame) - 10);

    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:columnSize];
    [self.manager addTextContainer:textContainer];

    UITextView *textView = [[UITextView alloc] initWithFrame:textViewFrame
                                               textContainer:textContainer];
    textView.scrollEnabled = NO;
    textView.editable = NO;
    textView.dataDetectorTypes = UIDataDetectorTypeAll;
    textView.delegate = self;
    textView.selectable = YES;

    UIImageView *goat = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"goat"]];
    [goat setContentMode:UIViewContentModeScaleAspectFit];
    goat.frame = CGRectMake(0.0, 0.0, 50.0, 50.0);

    [textView addSubview:goat];

    [self.scrollView addSubview:textView];

    textView.textContainer.exclusionPaths = @[[UIBezierPath bezierPathWithRect:CGRectMake(0.0, 0.0, 50.0, 50.0)]];

    currentXOffset += CGRectGetWidth(textViewFrame);

    lastRenderedGlyph = NSMaxRange([self.manager glyphRangeForTextContainer:textContainer]);
}

但是,这会导致应用冻结,并且我已将问题跟踪到每个NSTextContainer上的排除路径设置。例如,如果我没有设置排除路径,它可以正常工作。重要的是,如果我只在第一个NSTextContainer上设置排除路径,那么一切正常 - 但任何高于一个,应用程序冻结。我做错了什么,或者这是一个错误?

2 个答案:

答案 0 :(得分:3)

我想回想起来这很明显,但我得出的解决方案是在分配容器后立即为每个新NSTextContainer添加排除路径,但之前执行其他操作。即。

NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:columnSize];
textContainer.exclusionPaths = @[exclusionPath];
[manager addTextContainer: textContainer];

而不是:

NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:columnSize];
[manager addTextContainer: textContainer];
textContainer.exclusionPaths = @[exclusionPath];

会导致应用无响应。

当你知道如何时很简单。这仅适用于多列,多页面布局,您可以在其中创建多个文本容器和视图,并分解字形以使其正确匹配。如果您只在一个视图中添加一个排除路径,则似乎可以在任何位置添加排除路径。

答案 1 :(得分:0)

这对RichText中的ImageWrapping来说非常简单有用。但是应该记住一件事。一天前我尝试了这个,并发现相同的代码在iOS 7.0和iOS 7.1上的工作方式不同

TextView的闪烁光标出现在不同的位置,直到UITextView中没有文本。

我写了这段代码。

UIBezierPath* exclusionPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 38, 21)];
_txtViewMessage.textContainer.exclusionPaths  = @[exclusionPath];

并在iOS 7.1和iOS 7.0中找到以下结果

Left One:iOS 7.0  & Right One : iOS 7.1