macos - 自定义绘制的 NSView 在编辑的 subview 内重绘整个 View

标签 macos cocoa nsview

我有一个 NSView,它正在使用图像绘制自定义背景,但是每当我按下按钮或以编程方式编辑标签时,它似乎会在编辑的 subview 内再次绘制背景图像。我发现在 IB 中使 View 层支持可以解决该问题,但在我正在创建的较大应用程序中,使 View 层支持会导致大量其他问题。

我制作这个示例应用程序是为了尽可能清楚地显示正在发生的情况。第二张图像在按下按钮后发生,该按钮以编程方式编辑标签文本。背景图像似乎从按钮顶部开始围绕按钮和标签一起绘制。

View 是这样绘制的:

- (void) drawRect:(NSRect)dirtyRect {
    [[NSImage imageNamed:@"redGreenGradientBG.png"] drawInRect:dirtyRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
}

编辑前:

Before edit

编辑后:

After edit

有什么方法可以解决这个问题而不使 View 层支持?

(对总梯度感到抱歉——我认为这可以最清楚地说明我的观点)

最佳答案

传入到 -drawRect:dirtyRect 参数不是 View 的整个边界矩形,而是已标记为需要更新的矩形(即“脏”矩形,顾名思义)。

当您按下按钮或编辑标签时,它只会使该 subview 的边界矩形的显示状态无效,因此只有该矩形会作为 dirtyRect 传递。因此,您在这些屏幕截图中看到的是图像被绘制到 View 边界矩形内的一个较小的矩形中。

在您的情况下,您应该像这样在 -drawRect: 中重绘整个背景(通过使用 self.bounds 作为绘图矩形而不是 dirtyRect):

- (void)drawRect:(NSRect)dirtyRect {
    [[NSImage imageNamed:@"redGreenGradientBG.png"] drawInRect:self.bounds fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
}

关于macos - 自定义绘制的 NSView 在编辑的 subview 内重绘整个 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21843161/

相关文章:

cocoa - 当 Cocoa 中当前应用程序发生更改时收到通知

cocoa - 为什么 NSView 动画师在 Cocoa 中不起作用

ios - 链接到 OSX 上的 iOS 模拟器二进制文件

bash - 如何在脚本继续执行其他命令时使 osascript 显示对话框

ios - Lion(金大师)是 iOS 开发者计划的一部分吗?

swift - NSButton 不调用它的 Action

cocoa-touch - 如何在任务完成 block 中更新 UI?

cocoa - XIB 文件中的对象是如何定义的以及它们在运行时是如何创建的?

multithreading - Mac OS 访问数据模型时是否会调用诸如drawRect : concurrently from different threads? 这样的显示方法,这不是很危险吗?

objective-c - 从 NSView 加载 NSPanel