Lionの自動レイアウトでは、テキストフィールド(したがってラベル)が保持するテキストが大きくなるようにする必要があります。NSTextFieldをオートレイアウトのテキストに合わせる方法を教えてください。
テキストフィールドはInterface Builderでラップするように設定されています。
これを行う簡単で信頼できる方法は何ですか?
Lionの自動レイアウトでは、テキストフィールド(したがってラベル)が保持するテキストが大きくなるようにする必要があります。NSTextFieldをオートレイアウトのテキストに合わせる方法を教えてください。
テキストフィールドはInterface Builderでラップするように設定されています。
これを行う簡単で信頼できる方法は何ですか?
intrinsicContentSize
NSView
のメソッドは、ビュー自体が内在するコンテンツサイズと考えるものを返します。
NSTextField
は、セルのwraps
プロパティを考慮せずにこれを計算します。したがって、1行に配置するとテキストのサイズがレポートされます。受け入れ答えがintrinsicContentSize
を操作する上ではなくことがベースに
-(NSSize)intrinsicContentSize
{
if (![self.cell wraps]) {
return [super intrinsicContentSize];
}
NSRect frame = [self frame];
CGFloat width = frame.size.width;
// Make the frame very high, while keeping the width
frame.size.height = CGFLOAT_MAX;
// Calculate new height within the frame
// with practically infinite height.
CGFloat height = [self.cell cellSizeForBounds: frame].height;
return NSMakeSize(width, height);
}
// you need to invalidate the layout on text change, else it wouldn't grow by changing the text
- (void)textDidChange:(NSNotification *)notification
{
[super textDidChange:notification];
[self invalidateIntrinsicContentSize];
}
:
したがって、NSTextField
のカスタムサブクラスは、このような細胞のcellSizeForBounds:
方法によって提供される一つとして、より良い値を戻すには、このメソッドをオーバーライドすることができますすべての場合に必要ではありません。 Autolayoutは、(a)テキストフィールドにpreferredMaxLayoutWidth
を与え、(b)フィールドをeditable
にしない場合、テキストフィールドの高さを伸縮させます。これらの手順により、テキストフィールドで固有の幅が決定され、自動レイアウトに必要な高さが計算されます。詳細については、this answerおよびthis answerを参照してください。
テキストフィールドのeditable
属性の依存関係から、フィールドにバインドを使用していてConditionally Sets Editable
オプションのクリアに失敗した場合、autolayoutが壊れることになります。
これは私が見ているものとまったく同じです。明確にするために、このセルの 'ラップ'プロパティを無視することは、Mountain Lionで修正されたLionのバグであるようです。したがって、Lion以上をターゲットとしている場合は、バグ修正を適用してLionを高速化するまで、2つのOSで異なる結果が表示されます。 –
はい、これはLionのバグです。私は、Appleがこれらの問題をOS X 10.7と10.8の両方で解決することを本当に望む。私のインプリメンテーションでは、特別なケース(例:ライオンならば||言語が英語でない場合)をチェックし、身長を少し変えました。にもかかわらず、Monoloが投稿したものは良いスタートです。 – Arvin
intrinsicContentSize:メソッドは、setStringValue:によってテキストを変更すると呼び出されません。 – ideawu