2013-10-03 124 views
3

我正在使用UIPanGestureRecognizer和UIAttachmentBehavior在屏幕上移動UIView。當用戶結束手勢時,我使用UIDynamicItemBehavior和addLinearVelocity:forItem:方法將手勢識別器的速度應用於視圖。是否有可能知道[UIDynamicItemBehavior addLinearVelocity:forItem:]何時已完成運行?

這裏是我使用的代碼:

- (void)_handlePanGestureRecognized: (UIPanGestureRecognizer *)panGestureRecognizer 
{ 
    if (panGestureRecognizer.state == UIGestureRecognizerStateBegan) 
    { 
     _attachmentBehavior.anchorPoint = panGestureRecognizer.view.center; 
     [_dynamicAnimator addBehavior: _attachmentBehavior]; 
    } 
    else if (panGestureRecognizer.state == UIGestureRecognizerStateChanged) 
    { 
     CGPoint point = [panGestureRecognizer locationInView: panGestureRecognizer.view.superview]; 
     _attachmentBehavior.anchorPoint = point; 
    } 
    else if (panGestureRecognizer.state == UIGestureRecognizerStateEnded) 
    { 
     [_dynamicAnimator removeBehavior: _attachmentBehavior]; 

     CGPoint velocity = [panGestureRecognizer velocityInView: panGestureRecognizer.view.superview]; 
     [_dynamicItemBehavior addLinearVelocity: velocity 
      forItem: self]; 
    } 
} 

當視圖停止移動,然後我想有它捕捉到畫面的最接近的邊緣,但我目前還沒有辦法知道,當它已經停止沒有用CADisplayLink來查看視圖的中心。

回答

1

您是否嘗試過將UIDynamicAnimatorDelegate附加到您的動畫製作者,並使用dynamicAnimatorDidPause:方法觸發對齊到最近的邊緣?

從閱讀開發人員論壇,聽起來好像有些人的視圖在很長時間內保持運動狀態(例如來回跳動1像素),但也許這會適用於您的情況。

+0

我試過了。它確實有效,但是在物品停止移動後,回調會發生好一兩次。我意識到幕後的物理引擎可能仍然在進行計算,但我非常確定,如果使用CADisplayLink記錄視圖的中心,它將在調用dynamicAnimatorDidPause:之前幾秒鐘不會改變。 –

+0

是的,我認爲你是對的;定期檢查velocityForItem:在UIDynamicItemBehavior上查看它是否降到閾值以下可能是您最好的選擇。 – Greg

+0

令人討厭的是,Apple在2013年WWDC首次UIKit Dynamics演示中完全符合我的要求。會議206五分鐘後,他們將圖片放在屏幕上,如果它們落在一個盒子附近,它們會對齊它。他們說這是一個WWDC演示應用程序,但他們從未發佈源代碼。 –

相關問題