0

ユーザーがテキストを挿入しているときに自動的にサイズを変更するカスタムの「NSTextField」を実装しようとしています。

これは十分に単純なタスクであり、これが私が使用しているコードです。

- (void)textDidChange:(NSNotification *)aNotification
{
    [super textDidChange:aNotification];    
    [self invalidateIntrinsicContentSize];
}

- (NSSize)intrinsicContentSize
{
    if ( ![self.cell wraps] ) {
        return [super intrinsicContentSize];
    }
    NSRect frame = [self frame];
    CGFloat width = frame.size.width;
    frame.size.height = CGFLOAT_MAX;
    NSString *cellTitle = ((NSCell *)self.cell).title;
    CGFloat height = [self.cell cellSizeForBounds: frame].height;
    return NSMakeSize(width, height);
}

どちらが仕事をしますか。NSTextField好奇心は、のセルタイトルを呼び出す行にコメントすると

NSString *cellTitle = ((NSCell *)self.cell).title;

動作を停止します。セルは要求されるまでタイトルを更新しないようです。もちろん、セルのタイトルが変更されない場合、ユーザーがテキストを入力したときにテキストフィールドのサイズを変更することはできません。

この動作は機能ですか、それともバグですか?

私が言ったように、上記のコードは仕事をするので、これはもっと好奇心です。唯一の煩わしさは、回線が警告を生成することです。これを行うためのより良い方法があるかどうかを知りたいと思います。

編集:[(NSCell *)self.cell title];コンパイラへの行を変更すると文句が止まるかどうかを理解したことを気にしないでください。ただし、機能やバグに対する好奇心は依然として残っています。

4

1 に答える 1

0

"ビュー自体のプロパティのみを考慮して、受信ビューの自然なサイズを返します。

  • (NSSize)intrinsicContentSize

戻り値固有のプロパティに基づいて、受信ビューの自然なサイズを示すサイズ。

ディスカッションカスタムビューには通常、レイアウトシステムが認識しないコンテンツが表示されます。このメソッドをオーバーライドすると、カスタムビューは、コンテンツに基づいてどのサイズにするかをレイアウトシステムに伝達できます。変更された高さに基づいて変更された幅をレイアウトシステムに動的に伝達する方法がないため、この固有のサイズはコンテンツフレームから独立している必要があります。」

したがって、入力するときは、自分でフレームを設定する必要があります。入力した文字列の長さとフォントを取得すると、文字列の高さとTextFieldの高さを取得できます。ただし、「\n」などの注意が必要な文字もあります。
于 2013-01-04T07:00:01.627 に答える