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

Jos*_*iel 1 macos cocoa objective-c nsview

我想改变许多nsview的背景颜色.我覆盖了子类NSview上的drawRect:但我不知道如何为myview设置背景颜色(参考IBOUTLET).请帮我.非常感谢

CustomView.h的代码

 #import <Cocoa/Cocoa.h>

@interface CustomView : NSView

@end
Run Code Online (Sandbox Code Playgroud)

CustomView.m的代码

 #import "CustomView.h"

@implementation CustomView

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

@end
Run Code Online (Sandbox Code Playgroud)

在主要课程中,我添加#import "CustomView.h"但我不知道如何为myview设置背景.

uch*_*aka 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. 
}
Run Code Online (Sandbox Code Playgroud)

如果你想改变颜色,你需要一个@property NSColor你的绘图可能需要不止一个.

这允许您设置颜色.

您可能希望视图使用KVO并观察其自己的颜色属性,然后在颜色属性更改时绘制自身.

您可以做很多不同的事情来设置颜色.(其他地方的按钮或托盘)但是所有这些都最终会导致发送消息来设置视图属性的颜色以进行绘制.

最后,如果要更新绘图,则需要调用[myView setNeedsDisplay:YES];myView是对NSView子类实例的引用.还有,display但这是有力的. setNeedsDisplay:说要在下一次运行事件循环(runLoop)时安排它.display有点让一切都马上跳到那里.事件循环回来的速度足够快,你不应该强迫它.值得注意的setNeedsDisplay:是整个视图.在具有复杂视图的奇特理想世界中,您可能希望通过调用setNeedsDisplayInRect:将视图的特定CG/NSRect指定为需要重绘的位置来更适当地优化事物.这允许系统将重绘焦点集中到窗口中可能的最小联合矩阵.