NSView drawRect 方法不起作用?

NSView drawRect method not working?

现在我有两个 windows. 其中一个有一个 NSView,它充当背景颜色,另一个有一个颜色池,可以改变颜色共享实例中的变量。

我的程序可以正常工作。我可以打开我的 colorwell window 和 select 一种颜色,但是只有当我手动调整 window.

的大小时背景颜色才会更新

我试图通过在后台循环中创建一个线程来解决这个问题:

[self setNeedsDisplay:YES];
[self updateLayer];
[self display];

我不完全确定这 3 行是否必要,但我确定它们正在重新调用我的 drawRect 方法。

我什至在drawRect 方法中扔了一个NSLog 来测试。我在控制台中看到它被一遍又一遍地调用。

这是我的 drawRect 方法:

- (void)drawRect:(NSRect)dirtyRect{

        [theDATA.main_frame_background_color setFill];
        [NSBezierPath fillRect:dirtyRect];

}

theDATA.main_frame_background_color 是来自共享实例的 NSColor。我确信该值正在发生变化,因为当我调整 window.

大小时我的 NSView 会更新

我完全不知道为什么这不起作用。希望能帮到你。

首先,永远不要直接调用 display 方法。用 setNeedsDisplay: 标记脏区,一段时间后视图将被重绘。如果您的视图是支持图层的,请注意 layerContentsRedrawPolicy 属性,因为它的默认值为 NSViewLayerContentsRedrawNever。无法自动确定最适合您需求的策略,因此应手动设置此 属性。

感谢@Sega-Zero 关于使用 layerContentsRedrawPolicy 的建议,我解决了我的问题,通过一些研究,我发现我无法在线程中直接调用 setNeedsDisplay,所以我使用 performSelectorOnMainThread.

我的话题class:

- (void)updateLOOP{
    while (true){      

            [self performSelectorOnMainThread: @selector(refreshClock)
                                   withObject: nil
                                waitUntilDone: NO];

            [NSThread sleepForTimeInterval:.1];
        }
    }
}

外部更新方法:

- (void) refreshClock{
    [self setNeedsDisplay:YES];
}

现在一切正常。无需使用 [self display].

即可调用 drawRect 方法