繁体   English   中英

UIPanGestureRecognizer在iPhone 5s + iOS 7上不准确

[英]UIPanGestureRecognizer inaccurate on iPhone 5s + iOS 7

我正在使用UIPanGestureRecognizer在我的游戏(cocos2d 2.0)中平移,它从iOS 5.x到6.x一直运行良好。 突然在iOS 7中,它变得非常不稳定。 你可以平静一下,但最终会变得不准确。 甚至在我的游戏代码对手势做任何事情之前我都可以在我的日志中清楚地看到翻译大约是3-5点。 通常,平滑的手指拖动仅具有每次改变1个点的平移。 在屏幕边缘附近滑动似乎会立即导致问题,但只是平移也会导致问题。

是否有任何改变会导致cocos2d出现问题? 或者一般的手势识别器?

似乎与CADisplayLink刷新openGL视图和UIApplication的sendEvent方法存在一些优先级冲突。 我挣扎了一个星期! 在我的测试中,我发现只要手指移动,UIPanGestureRecognizer通常会在每次屏幕刷新时触发。 刷新GLKView(或我假设的任何openGL上下文)时,识别器通常会跳过几帧。 如果您连接CADisplayLink以刷新GLKView并平移,您可以自己查看。

-(void)panRecCallback:(UIPanGestureRecognizer *)rec{
    CGPoint loc = [panRec locationInView:self.view];
    printf("    rec loc %3.3f %3.3f\n",loc.x,loc.y);
}
-(void)display:(CADisplayLink *)displayLink{
    [myGLKView display];
    CGPoint loc = [panRec locationInView:self.view];
    printf("display loc %3.3f %3.3f\n",loc.x,loc.y);
}

我从来没有完全理解它,但我确实找到了一种超级 hacky方式,让它始终如一地顺利工作。 我发现在故障期间,识别器正在等待信号量,我认为这意味着openGL的绘图是在识别器的选择器发射之前发生的,并且它在某种程度上落后于足以阻止一个循环。 所以我的目标是延迟识别器,使其在下一次渲染之前触发。 这是hack部分,我在主线程上调度我的[glkView display]以便我的识别器被调用,然后我在一个块中捕获识别器动作并在周期过后触发它。 我不想说这就是我所能做的,但我的工作!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM