0

contentViewカスタム コントロールと 1 つのカスタムコントロールを含むウィンドウをプログラムで作成しようとしていますが、NSTextFieldこのウィンドウとビューの階層を自分自身で描画するのに問題があります。

カスタムのボーダレス ウィンドウを作成し、そのsetContentView/contentViewアクセサーをオーバーライドします。これは正常に機能しているようで、カスタムの contentViewinitWithFramedrawRectメソッドが呼び出され、contentView が正しく描画されます。

NSTextFieldしかし、プログラムでカスタムを追加しようとするとすぐに、contentView追加または描画されません。カスタムとは、指定されたイニシャライザ ( initWithFrame:frame- カスタム フォント設定のみ) と次のような drawRect メソッドをオーバーライドすることを意味します。

- (void)drawRect:(NSRect)rect {
    NSRect bounds = [self bounds];
    [super drawRect:bounds];
}

カスタム contentView の初期化子は次のようになります。

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self != nil) {
      // i want to draw itself to the same 
      // size as contentView thus i'm using same frame
      CustomTextField *textField = [[CustomTextField alloc] initWithFrame:frame];
      [self addSubview:textField];
      [self setNeedsDisplay:YES];
    }
    return self;
}

私はこれに数時間苦労してきたので、どんな指針も大歓迎です。リクエストに応じて、より多くのコードを入手できます。)

4

2 に答える 2

2

あなたの-drawRect:オーバーライドは私には間違っているようですが、なぜあなたは故意に渡されたrect引数を無視するのですか?なぜこれが必要なのですか?

テキストフィールドが表示されない理由については、設定していないことが原因である可能性があります。コードでNSTextFieldを作成すると、テキストフィールドをIBのビューにドラッグしたときに取得するデフォルトのインスタンスと同じものは取得されません。希望する外観を得るには、NSTextFieldとそのNSTextFieldCellを構成する必要があります。

私は次のように構成するプログラムで追加されたテキストフィールドを使用しています:

_textField = [[NSTextField alloc] initWithFrame:textFieldRect];
[[_textField cell] setControlSize:NSSmallControlSize];
[_textField setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
[_textField setBezelStyle:NSTextFieldSquareBezel];
[_textField setDrawsBackground:YES];
[_textField setBordered:YES];
[_textField setImportsGraphics:NO];
[_textField setAllowsEditingTextAttributes:NO];
[_textField setBezeled:YES];
[_textField sizeToFit];
[self addSubview:_textField];
[_textField setFrame:textFieldRect];
[_textField setAutoresizingMask:NSViewMinXMargin];
于 2009-09-27T01:58:55.490 に答える
2

回答ありがとうございます。

私は自分の問題を見つけました。drawRect が呼び出されなかった理由は、カスタム テキスト フィールドがコンテンツ ビューの枠外に描画されたためです。画面の中央にウィンドウを描画しているため、フレームに x/y オフセットがあったという重要な詳細について言及するのを忘れていたと思います。

ウィンドウをコンテンツ ビューで埋めるには、ウィンドウと同じフレーム (つまり、ウィンドウの (0;0) ポイントからの同じ (x;y) オフセット) で contentView を初期化します。

今、私はカスタム テキスト フィールドに書き込むことができませんが、それは私が処理できると思う別の問題です。

于 2009-09-27T06:10:31.283 に答える