如何在Cocoa中更改NSview的背景颜色

时间:2013-09-06 06:19:01

标签: objective-c macos cocoa nsview

我想更改许多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设置背景。

2 个答案:

答案 0 :(得分:10)

欢迎来到Cocoa绘画。 Cocoa绘图使用Quartz,这是一个PDF模型。 这样做是以一种从前到后的程序顺序进行的。

在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指定为需要重绘。 这允许系统将重绘重点放在窗口中可能的最小联合矩阵上。

答案 1 :(得分:0)

我来晚了,但这就是我的做法-无需子类:

NSView *myview = [NSView new];
[view setWantsLayer:YES];
view.layer.backgroundColor = [NSColor greenColor].CGColor;