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 方法
现在我有两个 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.
我完全不知道为什么这不起作用。希望能帮到你。
首先,永远不要直接调用 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]
.