我有一个GLKViewController来处理一些OpenGL绘图。我既实现了glkView:drawInRectupdate方法,又将preferredFramesPerSecond属性设置为30(默认值)。

问题在于,当用户与应用程序的其他部分进行交互时,委托(delegate)方法将停止触发。我看到的两种情况是用户滚动UITableView或与MKMapView交互时。

有没有一种方法可以确保这些委托(delegate)始终触发,而不管应用程序其余部分在做什么。我唯一希望这些停止的时间是当应用程序进入后台时(这是自动完成的)。

最佳答案

原因是在表 View 或 map View 中滚动时,运行循环位于UITrackingRunLoopMode中,它的优先级高于默认模式。这可以防止触发某些事件以确保高滚动性能。

为了解决您的问题,您必须设置自己的渲染循环,而不要依赖GLKViewController

  • 首先将enableSetNeedsDisplayGLKView设置为NO(使用GLKViewController时应自动设置)。
  • preferredFramesPerSecond设置为0(或可能为1)以禁用GLKViewController的呈现循环,或者完全不使用GLKViewController
  • 导入QuartzCore框架:#import <QuartzCore/QuartzCore.h>
  • 创建一个CADisplayLink并将其安排在NSRunLoopCommonModes中:

  • CADisplayLink * displayLink = [CADisplayLink displayLinkWithTarget:自我选择器:@selector(render :)];
    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
  • 可选:将displayLink的frameInterval设置为2(=帧速率的一半)
  • 渲染方法:

  • -(void)render:(CADisplayLink *)displayLink {
    GLKView * View =(GLKView *)self.view;
    [ View 显示];
    }

    我尚未对此进行测试,所以请告诉我它是否有效!

    关于iphone - GLKViewControllerDelegate被阻止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10080932/

    10-10 17:35