在 iOS 7 中,Apple 似乎改变了手势识别器的行为方式。以 UIPinchGestureRecognizer 为例。如果我在 UIGestureRecognizerStateChanged 中进行缓慢的重绘操作,这在旧版本的 iOS 下可以正常工作,但在较新的版本中,我的重绘通常不会在另一个 StateChanged 更新再次调用捏合手势之前呈现到屏幕上,并且再次调用慢速绘图操作。在系统使用我对视图的更改实际更新屏幕的可见部分之前,这种情况会反复发生很多次。
我发现一种解决方案是调用:
[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];
每当我收到 UIGestureRecognizerStateChanged 事件时。这样,每次完成时,绘图都会在屏幕上呈现。但是仍然存在“事件滞后”的问题,即一系列捏合事件排队,这样即使在我停止捏合屏幕很长时间后,图像也会继续缩放。
我的问题是是否有办法“刷新”排队的捏事件,所以每当我收到 UIGestureRecognizerStateChanged 事件时,我可以进行缓慢的绘图操作,然后刷新所有其他捏事件,因此只有最近的一个被处理。有谁知道这是否可能?我想我可以构建一个系统来查看 UIGestureRecognizerStateChanged 事件的时间,并抛出与最近重绘太接近的事件,但这似乎是一个 hack。
- (void) handleGlobalPinchGesture:(UIPinchGestureRecognizer*)_pinchGesture
{
if ( _pinchGesture.state == UIGestureRecognizerStateBegan )
{
// stuff
return;
}
if ( _pinchGesture.state == UIGestureRecognizerStateEnded || _pinchGesture.state == UIGestureRecognizerStateCancelled )
{
// end stuff
return;
}
if (_pinchGesture.state == UIGestureRecognizerStateChanged )
{
doSlowRedrawingOperationHere();
}
}