自定义绘制的NSView重绘整个视图内部编辑的子视图

时间:2014-02-18 02:23:20

标签: macos cocoa nsview

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

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

视图的绘制方式如下:

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

编辑前:

Before edit

修改后:

After edit

有没有办法在不让视图层支持的情况下解决这个问题?

(对于粗略的渐变感到抱歉 - 我认为这会说明我的观点最清楚)

1 个答案:

答案 0 :(得分:2)

传递给dirtyRect的{​​{1}}参数不是视图的整个边界矩形,而是已标记为需要更新的矩形(即“脏”矩形) ,顾名思义)。

当您按下按钮或编辑标签时,它仅使该子视图的边界矩形的显示状态无效,因此仅将该矩形作为-drawRect:传递。所以你在这些截图中看到的是图像被绘制到视图边界矩形内的一个较小的矩形中。

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

dirtyRect