2012-05-05 13 views

答えて

42

intrinsicContentSizeNSViewのメソッドは、ビュー自体が内在するコンテンツサイズと考えるものを返します。

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]; 
} 
+2

これは私が見ているものとまったく同じです。明確にするために、このセルの 'ラップ'プロパティを無視することは、Mountain Lionで修正されたLionのバグであるようです。したがって、Lion以上をターゲットとしている場合は、バグ修正を適用してLionを高速化するまで、2つのOSで異なる結果が表示されます。 –

+0

はい、これはLionのバグです。私は、Appleがこれらの問題をOS X 10.7と10.8の両方で解決することを本当に望む。私のインプリメンテーションでは、特別なケース(例:ライオンならば||言語が英語でない場合)をチェックし、身長を少し変えました。にもかかわらず、Monoloが投稿したものは良いスタートです。 – Arvin

+2

intrinsicContentSize:メソッドは、setStringValue:によってテキストを変更すると呼び出されません。 – ideawu

1

したがって、NSTextFieldのカスタムサブクラスは、このような細胞のcellSizeForBounds:方法によって提供される一つとして、より良い値を戻すには、このメソッドをオーバーライドすることができますすべての場合に必要ではありません。 Autolayoutは、(a)テキストフィールドにpreferredMaxLayoutWidthを与え、(b)フィールドをeditableにしない場合、テキストフィールドの高さを伸縮させます。これらの手順により、テキストフィールドで固有の幅が決定され、自動レイアウトに必要な高さが計算されます。詳細については、this answerおよびthis answerを参照してください。

テキストフィールドのeditable属性の依存関係から、フィールドにバインドを使用していてConditionally Sets Editableオプションのクリアに失敗した場合、autolayoutが壊れることになります。

関連する問題