在iOS 7中,Apple似乎改變了手勢識別器的行爲方式。以UIPinchGestureRecognizer爲例。如果我在UIGestureRecognizerStateChanged中做了一個緩慢的重畫操作,這在舊版本的iOS中用得很好,但在較新版本中,我的重繪通常不會在用另一個StateChanged更新再次調用捏手勢之前渲染到屏幕上,慢繪製操作再次被調用。在系統實際更新屏幕的可見部分並對視圖進行更改之前,會多次發生這種情況。我可以刷新UIGestureRecognizer事件嗎?
我發現一個解決方法是調用:
[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];
每當我得到一個UIGestureRecognizerStateChanged事件。這種方式在每次完成後都會在屏幕上呈現。但是仍然存在一個「事件滯後」的問題,即一系列夾點事件排隊等候,這樣在我停止捏住屏幕之後,圖像仍然保持縮放規模。
我的問題是,如果有辦法「沖洗」排隊的捏事件,所以每當我得到一個UIGestureRecognizerStateChanged事件,我可以做我的緩慢的繪製操作,然後沖刷所有其他捏事件,所以只有最近的一個得到處理。任何人都知道這是可能的嗎?我想我可以構建一個系統,查看UIGestureRecognizerStateChanged事件的時間,並將事件拋出過度接近最近的重繪,但這似乎是一種黑客攻擊。
- (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();
}
}
只是自己來問這個問題,並想知道你是否找到了解決方案Vern? – amergin
是的。我發現了一個適用於我的目的的'黑客'。似乎沒辦法沖洗事件。我會在下面發佈一個問題的答案。 –