【问题标题】:Block Mac UI controls painting/redrawingBlock Mac UI 控制绘画/重绘
【发布时间】:2011-11-18 11:52:51
【问题描述】:

您好,我想知道是否有人可以阐明如何启用/禁用从 nsview 继承的任何类的重绘?

我知道 Windows 有一条消息可以发送到 hwnd 以启用/禁用小工具绘制消息。这也会传播到子 hwnds。 Mac开发有没有等价的方法?

我有一个现有的 GUI 库,我想知道是否有不需要修改现有源代码的方法来做到这一点?

【问题讨论】:

  • 你想做什么?如果控件重绘,为什么会出现问题?
  • 仅作记录:问题是我使用的库可能会导致许多单独的绘画,因为它正在设置大量的小工具/视图。我正在寻找一种方法来扩充库(不更改库源),以启用重新绘制视图的块,直到我准备好。

标签: macos cocoa controls paint


【解决方案1】:

如果问题是您正在进行大量控制布局工作并且不想在这种情况下进行绘图,您可以使用[NSWindow disableScreenUpdatesUntilFlush] 或全局NSDisableScreenUpdates()NSEnableScreenUpdates() 函数来在您准备好之前阻止屏幕更新。

【讨论】:

    【解决方案2】:

    我不确定你到底想做什么,但想象一下你有一个 NSView 子类,它有一个 draw 方法

    .h

    BOOL shouldDraw;
    

    .m

    -(void)drawRect:(NSRect)someRect
    {
        if(shouldDraw)
        {
            [super drawRect:someRect];
        }
    }
    

    如果你从不调用 super 的 draw 实现,什么都不会被绘制。

    【讨论】:

    • 假设它不是一个图层托管视图。 (在图层托管视图中,绘图/图像保存由图层而不是视图完成;视图永远不会收到drawRect:,并且在那里为防止绘图而采取的任何措施都没有机会产生效果。 )
    • 我正在尝试影响任何现有的控制。例如文本字段、按钮等。你是说我必须对每个子类进行分类吗?我的目标是通过暂时禁用控件的绘制来防止我正在使用的 GUI 库发送过多的重印...
    • 你可能过早地优化了,在 mac 上,基本上每次有变化时视图都不会绘制,如果需要,它们只会定期绘制。你可以做一些分析来测试,但我怀疑你可能不会得到你期望的收益。
    • 你也可以做类似 [aView setNeedsDisplay:NO]...draw draw draw...wait wait wait...[aView setNeedsDisplay:YES];这会更像水。
    • @GradyPlayer:嗯? setNeedsDisplay: 影响视图是否会在下一个绘图周期发送drawRect:;为什么要设置成NO,然后手动画图,画完再设置成YES
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多