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 绘图使用 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];where myView is a reference to an instance of an NSView subclass。也有,display但那是有力的。 setNeedsDisplay:表示将其安排在事件循环的下一次运行(runLoop)上。display有点让一切立刻跳到那个地方。事件循环足够快地返回,你不应该强迫它。值得注意的是,setNeedsDisplay:是整个视图。在一个具有复杂视图的理想世界中,您可能希望通过调用setNeedsDisplayInRect:您指定视图的特定 CG/NSRect 需要重绘的位置来更适当地优化事物。这允许系统将重绘集中到窗口中可能的最小联合矩形。

于 2013-09-06T06:35:56.403 回答
0

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

NSView *myview = [NSView new];
[view setWantsLayer:YES];
view.layer.backgroundColor = [NSColor greenColor].CGColor;
于 2018-09-16T16:39:14.980 回答