【问题标题】:Cocoa Application does not redraw after overlapping another application重叠另一个应用程序后可可应用程序不重绘
【发布时间】:2012-09-26 14:15:17
【问题描述】:

在我将一个应用程序覆盖在我以前的应用程序上后,我返回到以前的应用程序并遇到一些错误:

  • 某些组件已消失
  • 使组件可见的唯一方法是调整窗口大小
  • 这似乎重新绘制了整个画布。

  1. 奇怪的是只有几个组件和绘制的图像丢失了
  2. 并不总是会发生,只会发生几次
  3. 我还没有找到重现问题的可靠方法。

有人知道为什么会这样吗?

【问题讨论】:

  • 这些组件/图像是如何绘制的?如果您想与 Apple 一起解决此问题,您将需要一个显示问题的示例应用程序;你能提供一个吗? (无论如何它都会很有用 - 我目前有一个无法在示例应用程序中重现的 CALayer 工件问题!)
  • 是否可以通过代码模拟调整大小?
  • 你可以打电话给[self setFrameSize:size]我想。
  • 应用中有自定义绘图吗?当问题发生时,应用程序是否会显得迟缓?可能表示内存问题?

标签: objective-c macos cocoa drawrect


【解决方案1】:

我遇到了完全相同的问题(视图只有在调整大小后才能正确更新),只是我在 OSX 游戏中使用了 OpenGL 绘图。

我的问题通过添加这个解决了:

GLint vblSynch = 1;
[[self openGLContext] setValues:&vblSynch forParameter:NSOpenGLCPSwapInterval];

在我的自定义 NSOpenGLView 初始化方法中。 然后我实现了:

- (void)drawRect:(NSRect)rect
{
    [self destroyFramebuffer]; // glDeleteFramebuffers..
    [self createFramebuffer];  // [super prepareOpenGl], glGenFrame(Render)Buffers, bind buffers, etc
    [self drawView]; // [[self openGLContext] makeCurrentContext], make some drawing, [[self openGLContext] flushBuffer]..
}

像这样。

在这些更改之后,当窗口获得焦点时,它会重新绘制自身(没有任何调整大小的东西:))。

希望这会有所帮助!

【讨论】:

  • 感谢洞察,但它不是一个 openGL 应用程序,我只是做了一个快速修复,当我的窗口变为活动状态时,它会调整大小,它不漂亮但它可以工作
  • 无论如何,我认为你应该看看你的 drawRect 方法。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2011-03-27
  • 1970-01-01
相关资源
最近更新 更多