問題タブ [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 に答える
762 参照

objective-c - NSLayoutManagerでテキストが折り返されないようにする

任意の1行の文字列が与えられた場合、私の目標はそれをビットマップ表現にレンダリングすることです。ただし、事前にその寸法を確認する手段がないため、グリフ範囲の境界を取得し、キャンバスが十分に大きくない場合はサイズを変更することになります。残念ながら、キャンバスの幅が文字列に対して十分ではなく、テキストを折り返すことができるほどの高さである場合、レイアウトマネージャはこれが最適であると判断します。レイアウトマネージャーがテキストを折り返すのを防ぐにはどうすればよいですか?

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

cocoa - メッセージウィンドウのようなスカイプを作成するにはどうすればよいですか?

メッセージウィンドウのようなSkypeを設計しようとしています。このために、NSDrawer要素を使用しました。左側にテーブルビュー、上部にメニューアイテム、右下にテキストフィールド、右側の中央部分にテキストビューが含まれています。テキストビューを使用して、文字列を表示して遊ぶことはできますが、メッセージ間に線を引いたり、ユーザー名とタイムスタンプを囲む長方形を丸くしたりすることはできません。

Skypeと同じ中央メッセージビューのルックアンドフィールを実現するにはどうすればよいですか?または、NSTextViewよりも優れたコントロールを使用できますか?

提案をありがとう...Miraaj

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

objective-c - NSTextView で特定範囲のテキストの背景をペイントする方法

これは特定のバグではなく、何かを行う方法がわからないことに関するものです。

私は NSTextView を持っており、ユーザーがテキスト ビューの特定の部分をクリックしたときに、特定の範囲のテキストの背景をペイントする必要があります。私はこれを試しましたが、テキストの前景色が失われたり、背景が範囲全体に及ばないことがあります。

簡単にするために、 range は常に有効な文字列であると仮定します (これは私のテスト環境にあります)。

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

cocoa - NSMutableParagraphStyle を新しい NSRange に適用しようとすると失敗します

全て、

基本的にボイラープレートテキストの挿入とインデントをサポートするように NSTextView を微調整しています。ボイラー プレートのインデント スタイルを編集した範囲から削除した後、ボイラー プレートのテキストのインデントが非ボイラー プレートのテキストに適用されるという問題が発生しています (ユーザーが Enter キーを押したときにスタイルを削除します)。ここで奇妙なことが起こります:

エディターでテキスト ルーラーを表示すると、インデントが変更される動作が見られます。リターン キーを入力したら、次のコードを実行します。

最初はこれでうまくいきましたが、カーソルをこの新しい行の上にあるボイラープレートのインデントされたテキストに移動すると、タブストップが再び表示され、カーソルをキャリッジリターンが作成した新しい行に戻しても消えません。 . 前の段落のスタイルが新しい段落に適用されているようです。

問題を示すビデオ (30 秒 1.3 MB) を Web に投稿しました。

http://gordonjl.com/files/indentingProblem%20-%20Computer.m4v

また: はい、これはひどい方法ですが、これはこのリリースの最後のバグであり、出荷する必要があります。今後のリリースでは、NSTextViews をスクロール領域に挿入し、より明示的な方法で管理したいと考えています。それまで、助けて!

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

objective-c - 属性付き文字列の幅を適切に決定する方法

私がしたいこと: NSLayoutManager を使用してテキストをレイアウトし、その NSTextContainer を文字列の配列で最も広い文字列 (グリフ単位) の幅に設定します。

私の問題は何ですか: テキストをレンダリングすると折り返されるため、「グリフ幅」の合計を決定する方法が正しくないようです。

Monaco 12 ポイント フォントで 32 文字の文字列を使用して実験を行ったところ、長さは 224.0 と報告されましたが、長さが 234.0 に設定されている場合にのみテキストの折り返しが停止します。

このコードは、上で述べたことを示しており、計算されたグリフ幅の右側に垂直線を示しています。

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

cocoa - Cocoa: NSTextStorageDelegate の NSLayoutManager が古くなっていますか?

私は NSTextView を使用しており、その-textStorageプロパティにデリゲートを設定しています。を受け取っ-textStorageDidProcessEditing:たら、テキストの一部に属性を適用する必要があります。

属性が適用されていますが、編集を行う-will...に常にテキストに適用されますdid...

実行中のこの時点でレイアウト マネージャーが最近のグリフの挿入/削除を認識していないかのように、NSTextView/NSTextStorage がデリゲート メソッドを呼び出しレイアウト マネージャーに更新を通知すると仮定します。

これを機能させるために、レイアウトマネージャーを強制的に更新してすぐに有効にする方法はありますか?

私はNSTextStorage-addAttribute:value:range:メソッドを認識しており、この時点までそれらを正常に使用してきましたが、リファクタリング/最適化の演習の一環として、代わりにレイアウト マネージャーを介してこれを行う必要がある時点に達しました。

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

cocoa - NSLayoutManager setallowsNonContiguousLayout がキャレットの位置を間違える

YESにsetAllowsNonContiguousLayout設定して、次の手順を実行すると、奇妙な動作が発生します。

  1. NSTextView 内のすべてのテキストを選択します
  2. すべてのテキストを削除するには、バックスペースを押します
  3. 数行のテキストを入力します
  4. バックスペースを使用してテキストを再度削除しようとしています

ステップ 4 で、カーソルは上の行にジャンプし、一見ランダムな位置に移動しますが、実際のグリフは正しい位置から削除されます。

不連続レイアウトは、このように少し実験的/バグがありますか? オフにすると、期待どおりに機能します。

Apple にバグ レポートを提出しますが、この動作を確認して回避した人はいますか?

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

cocoa - NSTextViewへの変更が画面に表示されない

Cocoaドキュメントのテキストシステムの概要の「手作業によるテキストシステムの組み立て」セクションに沿って、自分で作成したテキストシステムに裏打ちされたNSTextViewがあります。NSTextStorageの内容が画面に正常に表示されます。

しかし、入力しても何も起こらないようです。画面上のテキストは変わりません。テキストを選択すると、選択範囲の形からテキストが変更されたことがわかります。テキストをコピーしてテキストエディットに貼り付けると、編集内容も表示されます。そして、十分に入力すると、例外をスローすることができます。

ゴリー、これは私が一日の大部分をデバッグに費やすことができるようなもののように見えます。何が起きてる?

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

objective-c - NSTextView の行フラグメントの単一の四角形を再描画する

特定のイベントで単一行フラグメントを再描画する必要がある NSTextView があります。

基本的にはアウトラインです。したがって、特定の行で「タブ アウト」というメッセージが表示された場合、単にタブ キーを挿入するのではなく、グリフを含む四角形を移動する必要があります。

これを達成する方法のアイデアはありますか?

ありがとう!

0 投票する
3 に答える
12858 参照

objective-c - Core Text の行間隔はどのように機能しますか? (そして、なぜ NSLayoutManager と違うのですか?)

Core Text 関数を使用して、NSTextView を使用した場合に可能な限り近い行間でテキストを描画しようとしています。

例として、次のフォントを取り上げます。

NSTextView で使用する場合、このフォントの行の高さは 111.0.0 です。

ここで、コア テキストで同じことを行うと、結果は 110.4 になります (アセント、ディセント、リーディングを加算して行の高さを計算できると仮定します)。

これは 111.0 に非常に近いですが、一部のフォントでは差がはるかに大きくなっています。たとえば Helvetica の場合、NSLayoutManager は 115.0 を返しますが、CTFont の上昇 + 下降 + 進行 = 96.0 です。明らかに、Helvetica の場合、アセント + ディセント + リードを使用して行間の間隔を計算することはできません。

そこで、CTFrame と CTFramesetter を使用して数行をレイアウトし、そこから行間隔を取得すると考えました。しかし、それはまた異なる価値をもたらします。

したがって、行間隔は、私の NSTextView で使用されていた 111.0 とはさらに異なり、すべての行が等しいわけではありません。改行によって余分なスペースが追加されているようです (のデフォルト値paragraphSpacingBeforeは 0.0 ですが)。

NSLayoutManager を介して行の高さを取得し、各 CTLine を個別に描画することで、この問題を回避していますが、これを行うためのより良い方法があるかどうか疑問に思っています。