問題タブ [nslayoutmanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1081 参照

ios - NSLayoutManager、boundingRectForGlyphRange、絵文字

NSAttributedStringdrawInRect(rect: CGRect)メソッドを使用して、絵文字を含む可能性のあるテキストを表示しています。テキストのタップを検出したいので、次の方法を使用して、タップされた文字を確認します。

これにより、絵文字をテキストに追加し始めるまで作業できる正しいインデックスが得られます。絵文字が追加されるとすぐに、検出のオフセットが始まります。これにより、私が探していたグリフの境界四角形を見るようになりました。絵文字の外接する長方形が大きすぎることに気付きました。違いを確認するために、次のテストケースを設定しました。

このコードを実行すると、次CGRectの結果が得られました。

これが意味することは、これら 2 つの方法で 2 つのまったく異なるサイズが得られるということです! これは問題にはなりませんが、「オフセット」はより多くの行でスタックします。

積み上げオフセットの例

提供されたキャラクターに紫色の背景を設定し、緑色の輪郭の四角形characterIndexForPointを与えboundingRectForGlyphRange、黄色の点が実際のタップ位置です。緑色の四角形は別の文字ときれいに並んでいることに注意してください。ただし、この特定のケースではたまたまきれいに並んでいるため、これは何の指標にもなりません。

明らかなことを見落としていますか、それとも iOS の問題ですか?

0 投票する
0 に答える
187 参照

ios - UITextView から正確なレイアウト情報を取得する

動的に生成されたテキストの大きなブロック内の特定のポイントで UITextView に UIButton を配置しようとしています。しかし、タイムリーに正確な座標を取得することは非常に困難です。attributedText は、事前に生成された NSAttributedString で設定されています。現在、NSLayoutManager のデリゲート メソッドにボタンを追加しています。これが最も論理的な場所に思えたからです。ただし、他のオプションも受け入れます。

関連するコードは次のとおりです。

このコードはうまく機能しますが、UITextView の一番下までスクロールした場合にのみトリガーされます。ビューの一番下までスクロールしなくても、テキスト全体に対してすべてのレイアウトが確実に実行されるようにする方法はありますか? glyphRangeForTextContainer()、ensureLayoutForCharacterRange()など、「必要に応じてグリフの生成とレイアウトを実行する」と言うNSLayoutManagerのメソッドをいくつでも試しましたが、必要なことをしていないようです。

また、viewWillAppear() や viewDidLoad() など、コードの他の場所にボタンを追加しようとしました。ただし、ここで試してみると、レイアウト強制メソッドを呼び出した場合でも、boundingRectForGlyphRange() を呼び出すと、NSTextAttachment 画像の座標が返されますが、これは画像が実際に textView で終了する場所に正確ではないため、ボタンが非常に不正確な場所に配置されます。

テキストのレイアウトがどのように発生するかについて、何か重要なことが欠けていることは間違いありませんが、それが何であるかについては途方に暮れています。どんな助けでも大歓迎です!

0 投票する
1 に答える
640 参照

swift - Swift の drawGlyphsForGlyphRange (見えない文字の表示)。replaceGlyphAtIndex 非推奨

以下のクラスと関数を使用して非表示の文字を表示しようとしていますが、正常に動作しています。

しかし、replaceGlyphAtIndex は OS X 10.11 で廃止され、setGlyhs() を使用する必要があります。

しかし、replaceGlyphAtIndex を setGlyphs に変換する方法に問題があります。replaceGlyphAtIndex の下を setGlyphs() に変換する方法を教えてもらえますか?

私は以下のように試しましたが、クラッシュしています。

上記のコード行で何が問題になっているのか、誰か教えてもらえますか?

}

0 投票する
1 に答える
524 参照

objective-c - NSTextView で表示できるすべてのテキストを選択する方法は?

境界内のテキストだけをプログラムで選択し、ウィンドウがスクロールまたは境界を変更するときにそれを変更する方法が必要です。

SelectAll動作しないでしょう。ドキュメント全体は必要ありません。私の目標は、ウィンドウにスクロールして表示されるテキストに反応し、それをスキャンしてキーワードを探し、コンテキスト情報を 2 番目のウィンドウに表示することです。

0 投票する
2 に答える
1521 参照

swift - NSLayoutManager は、何をしても改行文字を非表示にします

NSTextView サブクラスで改行文字などの非表示の文字を表示しようとしています。NSLayoutManager の drawGlyph メソッドをオーバーライドするような通常のアプローチは、遅すぎて複数ページのレイアウトで適切に機能しないため、お勧めできません。

私がやろうとしているのは、NSLayoutManager の setGlyph メソッドをオーバーライドして、非表示の "\n" グリフを "¶" グリフに、" " を "∙" に置き換えることです。

また、" " スペース グリフでは機能しますが、改行文字には影響しません。

それから私はアイデアを思いつきました: NSTypesetter は、まったく処理してはならないような新しい行の文字範囲をマークしているようです。そこで、NSTypesetter をサブクラス化し、メソッドをオーバーライドしました。

しかし、それは機能していません。NSLayoutManager は、作成したグリフに関係なく、改行文字のグリフを生成しません。

私は何を間違っていますか?

0 投票する
1 に答える
1187 参照

objective-c - NSLayoutManager に別のフォントでグリフを描画させる

NSLayoutManager に異なる属性を持つ範囲でグリフを描画させようとしていますが、それでも NSTextStorage オブジェクトに設定された属性を使用します。

別のフォントから NSGlyph を作成し、それを NSTypesetter のグリフ ストレージにあるものに置き換えようとしていました。しかし、それは役に立ちます。レイアウト マネージャーは、テキスト ストレージ属性文字列で指定されたフォントと色でグリフを描画します。

ある範囲でこれらの属性を無視し、必要なフォントと色で作成したグリフを描画するようにレイアウト マネージャーに強制するにはどうすればよいですか? 目に見えない文字を描画する最も効率的な方法に取り組んでいるため、これが必要です。