首页 文章

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

提问于
浏览
0

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

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

视图是这样绘制的:

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

Before edit:

Before edit

After edit:

After edit

有没有什么办法可以解决这个问题,而不会让视图层支持?

(抱歉粗略的渐变 - 我认为它会说明我的观点最清晰)

1 回答

  • 2

    传入 -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 ):

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

相关问题