gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:39:41 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com