問題タブ [intrinsic-content-size]
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.
macos - カスタム テキスト ビューの自動レイアウト サポート
この質問は、制約を使用して可変高さのカスタム テキスト ビューをサポートし、自動レイアウト用にビューの本質的なコンテンツ サイズをサポートすることに関するものです。「複製」ボタンをクリックする前に、私の話を聞いてください。
カスタム テキスト ビューがあります (ゼロから、NSView から継承します)。通常の NSTextView 機能の多くをサポートします。ここで最も関連するのは複数行であり、利用可能な幅に基づいてコンテンツをレイアウトします。ビルド対象のアプリは、これらのテキスト ビューをテーブル ビューの各行に読み込みます。問題は、intrinsicContentSize に従って高さが適切に設定されないことです。
問題を単純化するサンプル プロジェクトを作成しました。必要な幅/高さを決定するために使用される文字の数とサイズが固定された「疑似」テキストビューを使用します。サンプルには、1 つの列のテーブル ビューがあり、そのセル ビューには PseudoTextView という 1 つのサブビューしかありません。テキスト ビューは、セル ビューの端に固定され、少しパディングされています。セルビューでしっかりとラップされたテキストビューの高さを拡大できるようにしながら、テキストビューが幅を定義する制約に従う必要があることをシステムに認識させるにはどうすればよいですか? テキストビューのコードは次のとおりです。
このバージョンは、ビューのフレームに基づいて適切なサイズを返します。フレームが設定されていない場合、レイアウトの updateConstraints フェーズ中にアクセスされるため、これは明らかに機能しません。また、幅に NSView.noIntrinsicMetric を使用してみましたが、これによりテキスト ビューの幅がゼロになり、高さが回復しません。他にも膨大な数の試みを行ってきましたが、それらすべてで退屈することはありません。
NSTextField は別のことを行います (「編集可能」がオフで、「ラップ」がオンであると仮定します)。それは、intrinsicContentSize が (使用可能な幅よりもはるかに長い場合でも) 1 行でテキストの全幅を報告しますが、どういうわけか正しい幅にサイズ変更されます。サイズが変更されると、intrinsicContentWidth は 1 行の幅全体を報告しますが、高さは複数の行を考慮して調整されます。私が占うことができなかったどこかの魔法があります。
関連ドキュメントのすべての行を読みました。トピックに関するブログ投稿があれば、おそらくそれを読んだことがあります。トピックに関する SO に関する質問がある場合は、おそらくそれを読んだことがあります。あなたがそのトピックに関する本を書いた場合、私はおそらくそれを購入しました。これらの情報源はすべて、私が抱えている問題をからかっていますが、この特定の状況をどのように処理するかという質問に答えるものはありません. やけくそ。
アップデート:
Jonathon Mah による古いブログ投稿 ( http://devetc.org/code/2014/07/07/auto-layout-and-views-that-wrap.html ) を読んだ後、彼のアプローチを使用する例を作成しました。これは、彼のテクニックを模倣して正しく動作する別のプロジェクトです。これはアプリの上部です。スライダーで調整する固定コンテナ ビューです。パッチワークは、背景がピンク色のカスタム ビューの疑似キャラクターです。
ただし、自己サイズ調整テーブル ビューに挿入すると、カスタム ビューはそのセルの幅に正しく一致しますが、セルは固有の高さを考慮して調整されません。カスタム ビューの下部制約をオプションに変更すると (たとえば、 >= 関係を使用して)、カスタム ビューは正しい高さに縮小されますが、セル ビューは固定されたままになります。サブビューのintrinsicContentSize.heightを尊重するために、セルビューの高さを縮小するように説得するにはどうすればよいですか?