1

多くの nsview の背景色を変更したい。サブクラス NSview で drawRect: をオーバーライドしますが、myview の背景色を設定する方法がわかりません (参照 IBOUTLET です)。私を助けてください。本当にありがとう

CustomView.h のコード

 #import <Cocoa/Cocoa.h>

@interface CustomView : NSView

@end

CustomView.m のコード

 #import "CustomView.h"

@implementation CustomView

- (void) drawRect:(NSRect)dirtyRect {
    [[NSColor whiteColor] setFill];
    NSRectFill(dirtyRect);
    [super drawRect:dirtyRect];
}

@end

メインクラスで追加しまし#import "CustomView.h"たが、myviewの背景を設定する方法がわかりません。

4

2 に答える 2

10

ココアの描画へようこそ。Cocoa の描画は、PDF モデルである Quartz を使用します。この描画は、後ろから前の手順で行われます。

Quartz 描画には、Graphics Context と呼ばれる描画環境状態オブジェクトがあります。これは、AppKit の描画操作の多くで暗黙的なオブジェクトです。(Core Graphics またはその他の API では、明示的に呼び出す必要がある場合があります)

グラフィックス コンテキストに現在の色やその他のパラメーターを伝えてから、何かを描画し、パラメーターを変更してさらに描画します。AppKit では、NSColor オブジェクトにメッセージを送信することでこれを行いますが、これは奇妙です。しかし、それがどのように機能するかです。

drawRect: メソッドでは、おそらくその上に描画する必要があるため、通常は最初に super を呼び出す必要があります...

- (void) drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

   // This next line sets the the current fill color parameter of the Graphics Context
    [[NSColor whiteColor] setFill];
   // This next function fills a rect the same as dirtyRect with the current fill color of the Graphics Context.
    NSRectFill(dirtyRect);
   // You might want to use _bounds or self.bounds if you want to be sure to fill the entire bounds rect of the view. 
}

色を変更したい場合は、@property NSColor が必要です。描画には複数必要になる場合があります。

これにより、色を設定できます。

ビューで KVO を使用して独自の色プロパティを観察し、色プロパティが変更された場合にそれ自体を描画することができます。

色を設定するには、さまざまなことを行うことができます。(別の場所にあるボタンまたはパレット) しかし、それらのすべてが最終的に、描画用にビューのプロパティの色を設定するメッセージを送信することになります。

最後に、図面を更新する場合[myView setNeedsDisplay:YES];は、 myView が NSView サブクラスのインスタンスへの参照である場所を呼び出す必要があります。もありますがdisplay、それは強引です。 setNeedsDisplay:イベント ループ (runLoop) の次の実行時にスケジュールするように指示します。displayすべてがすぐにジャンプします。イベント ループは、強制する必要のない速さで戻ってきます。特筆すべきsetNeedsDisplay:は全景です。setNeedsDisplayInRect:複雑なビューを持つ派手な理想の世界では、ビューの特定の CG/NSRect を再描画する必要があると指定する場所を呼び出して、より適切に最適化することをお勧めします。これにより、システムは再描画をウィンドウ内の可能な限り最小の結合矩形に集中させることができます。

于 2013-09-06T06:35:56.403 に答える