2013-10-31 62 views
4

在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(); 
    } 
} 
+0

只是自己來問這個問題,並想知道你是否找到了解決方案Vern? – amergin

+0

是的。我發現了一個適用於我的目的的'黑客'。似乎沒辦法沖洗事件。我會在下面發佈一個問題的答案。 –

回答

0

我從來沒有找到一個方法來「沖洗」這些事件,但我沒有找到一個「黑客」,確保每一個渲染反映在屏幕上,所以用戶可以看到實時的手勢動作,即使這種重繪操作很慢。我的解決方案是撥打電話:

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]]; 

給'操作系統時間'做屏幕上的重繪。我從我的手勢識別器回調中完成此操作,並且只能在iOS 7或更高版本上運行。

上述調用必須添加到您的所有手勢識別器(在呈現新內容之後)的回調中。希望這可以幫助別人!

如果你想獲得良好的用戶體驗,那麼這個'黑客'目前似乎是iOS 7中需要的,當你的緩慢渲染髮生在手勢的直接響應中。

+0

不適合我。 –

+0

iOS 7或8?我還沒有在8測試過。 –

1

我不認爲,這是手勢識別器的問題,我在移動經過轉換的視圖時遇到同樣的問題。我已經解決了它,通過附加查看的drawRect方法,並調用 - (空)setNeedsDisplay方法之前改變視圖的中心: 鑑於:

- (void)drawRect:(CGRect)rect 
{ 
    [super drawRect:rect]; 
} 

在手勢識別器的作用:

[CATransaction begin]; 
[CATransaction setValue:@(YES) forKey:kCATransactionDisableActions]; 

_destinationIndicatorView.center = center; 
[self.frameView setNeedsDisplay]; 
self.frameView.center = center; 

[CATransaction commit]; 

它適用於我。

相關問題