NSView drawRect方法不起作用?

时间:2015-07-03 20:22:51

标签: objective-c macos cocoa nsview

现在我有两个窗口。其中一个有一个NSView,它作为背景颜色,另一个有一个颜色可以改变共享实例中的颜色变量。

我的程序有点工作。我可以打开我的色彩窗口并选择一种颜色,但是如果手动调整窗口大小,背景颜色只会更新。

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

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

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

我甚至将一个NSLog放入drawRect方法进行测试。我在控制台中看到它被反复调用了。

这是我的drawRect方法:

- (void)drawRect:(NSRect)dirtyRect{

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

}

theDATA.main_frame_background_color是来自共享实例的NSColor。我很肯定价值正在改变,因为当我调整窗口大小时我的NSView会更新。

我完全不清楚为什么这不起作用。希望你能帮忙。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

My Thread课程:

- (void)updateLOOP{
    while (true){      

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

            [NSThread sleepForTimeInterval:.1];
        }
    }
}

外部更新方法:

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

现在一切正常。无需使用[self display]即可调用drawRect方法。