【问题标题】:Adding exclusion paths to multiple text views向多个文本视图添加排除路径
【发布时间】:2013-11-20 01:56:52
【问题描述】:

我正在尝试将多个排除路径添加到一系列UITextViews,依次排列在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 上设置排除路径,那么一切正常 - 但任何超过一个,应用程序都会冻结。我做错了什么,还是这是一个错误?

【问题讨论】:

    标签: ios uiscrollview uitextview textkit


    【解决方案1】:

    我想回想起来这很明显,但我得出的解决方案是在分配容器之后但做其他任何事情之前为每个新的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];
    

    导致应用无响应。

    只要你知道怎么做,就很简单。这仅适用于创建多个文本容器和视图并分解字形以使其适合的多列、多页布局。如果您只向一个视图添加一个排除路径,似乎您可以在任何地方添加排除路径。

    【讨论】:

    • 我在布局后在文本视图上设置了排除路径。它运行良好,直到 iOS 7.1。感谢您的解决方案。
    • 如何使用 UITableViewCells 做到这一点?如果单元格出队,它会以 100% 的 CPU 负载冻结设备。这是来自 Apple 的错误吗?
    • 我猜这是 Apple 的错误,是的。
    【解决方案2】:

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

    TextView的Blinking Cursor出现在不同的地方,直到UITextView中没有文字。

    这段代码是我写的。

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

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

    【讨论】:

    • 你找到解决办法了吗?
    • 不,还没有!仍在寻找解决方案
    猜你喜欢
    • 1970-01-01
    • 2020-07-03
    • 2015-08-25
    • 2020-06-24
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多