3

次のようUITextViewに、 a に連続して配置された一連の に複数の除外パスを追加しようとしています。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と、すべてが正常に機能しますが、1 を超えるとアプリがフリーズします。私は何を間違っていますか、それともバグですか?

4

2 に答える 2

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 つのビューに 1 つの除外パスのみを追加する場合、除外パスはどこにでも追加できるようです。

于 2013-11-27T22:55:59.940 に答える
0

これは、RichText の ImageWrapping にとって非常に簡単で便利なことです。しかし、心に留めておくべきです。1日前にこれを試してみたところ、同じコードがiOS 7.0とiOS 7.1で異なる動作をしていることがわかりました

UITextView にテキストがなくなるまで、TextView の点滅カーソルが別の場所に表示されます。

このコードを書きました。

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

iOS 7.1 および iOS 7.0 で以下の結果が見つかりました

左: iOS 7.0 & 右: iOS 7.1

于 2014-04-04T07:23:52.070 に答える