3

私は TextKit フレームワークを使用して、次のような列にテキストをタイプセットするビューに取り組んでいます: 列テキストのレイアウト

UIViewの境界をエッジ インセット (黒い四角形) で使用して 10 を計算し、それを(赤い四角形)CGRectsに変換します。NSTextContainersで、グリフをタイプセットして描画する にdrawRect:それらを渡します。NSLayoutManager

私の質問は次のとおりです。必要な列の数を計算するにはどうすればよいですか? 一定数の列を描画できますが、テキストの長さが変化するため、列の数をプログラムで調整する必要があります。

[NSLayoutManager glyphRangeForTextContainer:]テキスト コンテナを空のままにしておくと、長さ 0 の範囲を返すメソッドが見つかりました。したがって、ループしてテキスト コンテナーを作成し、このメソッドを使用してさらにコンテナーが必要かどうかを判断することができます。ただし、この方法はレイアウト計算をトリガーするため非効率的であると言われています。おそらく何百回もループして実行するのは好ましくありません。

もっと良い方法があるはずです!

答えてくれてありがとう、ピート。

4

1 に答える 1

3

まあ、TextKit フレームワークを掘り下げた後、私はついに答えを見つけました。

私のコードは次のようなループで動作します:

while ([self needsMoreColumns]) {
    [self addColumn];
}

...

- (BOOL)needsMoreColumns {
    // Always create at least one column
    if (self.layoutManager.textContainers.count == 0)
        return YES;

    // Find out the glyph range of the last column
    NSRange range = [self.layoutManager glyphRangeForTextContainer:[self.layoutManager.textContainers lastObject]];
    NSUInteger glyphs = [self.layoutManager numberOfGlyphs];

    // Compare it with the number of glyphs
    return range.location + range.length < glyphs;
}

メソッド[self addColumn]は簡単なので含めませんでした。レイアウトのジオメトリと最後の列 (ある場合) の位置を使用してCGRect、次の列を計算します。次に、NSTextContainerそれぞれのサイズで作成しorigin、長方形のプロパティを描画専用の配列に格納します。

メソッドも発見[NSLayoutManager firstUnlaidCharacterIndex]しまし[NSLayoutManager firstUnlaidGlyphIndex]たが、期待どおりに機能していないようです。3 列分のテキストを 1 列だけにレイアウトした後、最初の列に収まらなかった最初の文字の位置ではなく、文字列全体の長さを返しました。そのため、むしろ範囲ベースのアプローチを使用しました。

これですべてです。安全を確保してください。ピート。

于 2014-08-29T09:22:34.300 に答える