0

ドラッグアンドドロップビューで作業していて、Web上でドラッグアンドドロップアクションのハンドラーを見つけました。ユーザーがドラッグアンドドロップ領域にファイルをドラッグすると青色になり、ドラッグアンドドロップ領域を出ると再び灰色になるようにしたいと思います。問題は、マウスをその上にドラッグしたり終了したりしても更新されないことです。ここにいくつかのコードがあります:

- (void)drawRect:(NSRect)rect
{
   NSRect bounds = [self bounds];
   [[NSColor grayColor] set];
   [NSBezierPath fillRect:bounds];
}

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender  {
    NSRect bounds = [self bounds];
    [[NSColor blueColor] set];
    [NSBezierPath fillRect:bounds];

    return NSDragOperationCopy;

}

- (void)draggingExited:(id <NSDraggingInfo>)sender {
    NSRect bounds = [self bounds];
    [[NSColor grayColor] set];
    [NSBezierPath fillRect:bounds];

}

助けてくれてありがとう。

4

2 に答える 2

2

[yourView: setNeedsDisplay]どこかに電話していますか?

UIViewこれは、サブクラスにメッセージを送信する必要があることを描画フレームワークに通知する方法ですdrawRect:。したがって、状況が変わったときはいつでもそれを行う必要があります。あなたの場合、これはおそらくマウスがドロップエリアに出入りするときを意味します。

于 2010-07-14T02:56:40.920 に答える
1

描画は、描画するためのコンテキスト (ペイント用のキャンバスなど) が設定されている場合にのみ機能します。フレームワークが呼び出す-drawRect:と、描画コンテキストが設定されているので、 や などの描画コマンド-[NSColor set]-[NSBezierPath fillRect:]期待どおりに機能します。

外部で-drawRect:は通常、描画コンテキストは設定されていません。外部で描画コマンドを使用すること-drawRect:は、絵筆を空中で振るようなものです。キャンバスがないので、絵は描かれません。

99.99% の場合、すべてのビューの描画は内部に保持する必要があります-drawRect:。これは、NSView が、描画コンテキストを正しく効率的にセットアップするためにやりたくない多くの作業を行うためです。

-draggingEntered:では、 and-draggingExited:メソッド内でビューの描画を変更するにはどうすればよいでしょうか。副作用で.

1) 色の設定と 2) 長方形の描画の 3 つのケースすべてで同じことを行っています。唯一の違いは、各方法で色が変わることです。-drawRect:では、次のように ivar で使用する色を制御してみませんか。

- (void)draggingEntered:(id <NSDraggingInfo>)sender {
    drawBlueColorIvar = YES;
    // ...
}

次に、-drawRect:これを行います:

- (void)drawRect:(NSRect)rect {
    NSColor *color = drawBlueColorIvar ? [NSColor blueColor] : [NSColor grayColor];
    [color set];
    [NSBezierPath fillRect:rect];
}

(私は を使用しなかったことに注意してください[self bounds]。可能であれば、「ダーティ」矩形に描画する方が効率的です。)

最後に、drawBlueColorIvar が変更されたときにビューを再描画する必要があることをフレームワークに伝える何らかの方法が必要です。フレームワークは、必要があると指示されない限り、何も描画しません。Chris Cooper が言ったように、これは で行い[self setNeedsDisplay:YES]ます。これは、変更した場所の後に移動する必要がありますdrawBlueColorIvar

于 2010-07-14T16:24:35.463 に答える