我有一个用图像绘制自定义背景的NSView,但每当我按下按钮或以编程方式编辑标签时,它似乎在编辑的子视图内再次绘制背景图像 . 我发现在IB中制作视图层支持解决了这个问题,但是在我正在创建的更大的应用程序中,使视图层支持会导致大量其他问题 .
我制作了这个示例应用程序,以尽可能清楚地显示正在发生的事情 . 第二个图像在按下按钮后发生,该按钮以编程方式编辑标签文本 . 从按钮顶部开始,似乎背景图像同时围绕按钮和标签 .
视图是这样绘制的:
- (void) drawRect:(NSRect)dirtyRect {
[[NSImage imageNamed:@"redGreenGradientBG.png"] drawInRect:dirtyRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
}
Before edit:
After edit:
有没有什么办法可以解决这个问题,而不会让视图层支持?
(抱歉粗略的渐变 - 我认为它会说明我的观点最清晰)
1 回答
传入
-drawRect:
的dirtyRect
参数不是视图的整个边界矩形,而是已标记为需要更新的矩形(即"dirty"矩形,顾名思义) .当您按下按钮或编辑标签时,它仅使该子视图的边界矩形的显示状态无效,因此仅将该矩形作为
dirtyRect
传递 . 你是什么're seeing in those screenshots is the image being drawn into a smaller rectangle inside your view'的边界矩形 .在你的情况下,你应该像这样重绘
-drawRect:
中的整个背景(使用self.bounds
作为绘图矩形而不是dirtyRect
):