0

テキストフィールドの「自然な」サイズを計算できるようにすることは、一般的に 受け入れられているようです。cellSizeForBounds:ただし、NSTextField については、完全に一致しないことがわかりました。

@interface MyTextField : NSTextField @end
@implementation MyTextField
- (void)textDidChange:(NSNotification *)notification {
    [super textDidChange:notification];
    [self validateEditing];  // Forces updating from the field editor

    NSSize cellSize = [self.cell cellSizeForBounds:
                       NSMakeRect(0, 0, self.bounds.size.width, CGFLOAT_MAX)];
    NSRect frame = self.frame;
    CGFloat heightDelta = cellSize.height - frame.size.height;
    frame.size.height += heightDelta;
    if (!self.superview.flipped) { frame.origin.y -= heightDelta; }
    self.frame = frame;
}
@end

(私は自動レイアウトを使用していませんが、原則は同じです。この問題はすべての文字列で発生するわけではありませんが、再現するのは非常に簡単です。)

これは、余分なオフセットを追加するテキスト フィールドの境界線が原因であると思われます。cellSizeForBounds:と NSTextField の関係を自動的に計算する方法はありますframeか? 他にどのようにこの問題を解決できますか?

4

1 に答える 1

1

セルサイズとフレームサイズに違いがあります。それを判断する最善の方法は、テキスト フィールドに を使用して内容に合わせて-sizeToFitサイズを変更し、セル サイズとフレーム サイズを比較することです。画面外のセカンダリ テキスト フィールドを使用してこれを行うことができます。サイズを変更しようとしているテキスト フィールドと同じように、すべてのパラメータを設定してください。また、セルのサイズは「正確に」フィットします。つまり、幅または高さが部分的になる可能性があります。結果のフレーム サイズ-sizeToFitは整数になります。ceil()そのため、フレーム サイズと比較して境界線のサイズを計算する前に、セル サイズ コンポーネントに適用する必要があります。

理論的には、特定のテキスト フィールド構成/スタイルに対してこれを行う必要があるのは 1 回だけです。

于 2016-02-13T07:27:36.213 に答える