2014-12-26 66 views
3

當用戶點擊超級視圖時,我通過UITapGestureRecognizer檢測到它,並調用下面的函數來創建一個UIImage視圖,將其添加到超級視圖中,向其添加重力並讓它從超級視圖中消失。如何讓多個UIImage在同一時間與重力下降?

問題是,如果用戶再次點擊屏幕上仍然存在第一個UIImage,則第一個圖像會停止,第二個圖像開始下降。讓多個UIImage獨立落在屏幕上的最佳方式是什麼?

其次,我覺得,我應該從上海華被刪除這些UIImage以節省內存(因爲可能有數百個水龍頭,但我無法弄清楚如何自動只要它是在屏幕的刪除UIImage

幫助中迅速請。

func dropBall(tapLocation:CGPoint) { 
    let ball = UIImageView(image: UIImage(named: "White50.png")) 
    ball.frame = CGRect(origin: CGPoint(x:tapLocation.x-25,y:tapLocation.y-25), size: CGSize(width:50,height:50)) 
    view.addSubview(ball) 

    animator = UIDynamicAnimator(referenceView: self.view) 
    gravity = UIGravityBehavior(items: [ball]) 
    animator.addBehavior(gravity) 
} 

回答

7

第一動畫停止的原因是,當你再次調用該方法,你實例化一個新的動畫和釋放舊的。你應該實例化的動畫只有一次,同樣,你應該實例化一次重力。

在視圖關閉後停止行爲方面,一種技術是爲行爲添加一個action塊,遍歷行爲項目並查看每個項目是否仍在屏幕上,並從行爲列表中刪除項目項目脫離屏幕時的項目。

override func viewDidLoad() { 
    super.viewDidLoad() 

    animator = UIDynamicAnimator(referenceView: view) 

    gravity = UIGravityBehavior() 
    gravity.action = { [unowned self] in 
     let itemsToRemove = self.gravity.items.filter() { !CGRectIntersectsRect(self.view.bounds, $0.frame) } 
     for item in itemsToRemove { 
      self.gravity.removeItem(item as UIDynamicItem) 
      item.removeFromSuperview() 
     } 
    } 
    animator.addBehavior(gravity) 
} 

現在,給一個項目的重力,只需將項目添加到重力行爲,當它落在拿出來看它會自動將其刪除:通過移動「動畫

gravity.addItem(ball) 
+0

= .. ..「行查看確實加載,第一個問題解決了,現在所有的球都在同時下降。你能解釋一下如何添加行動嗎? – Kashif

+0

並且這引起了警告:「每個動畫師的多重引力行爲是未定義的,並且可能在將來會斷言」 – Kashif

+0

@ user4293473是的,我剛剛看到了這一點。因此,一次添加重力,然後將項目添加到重力的「項目」數組中。並且定義'action',當項目的'frame'不再與'superview'的'bounds'相交時刪除項目。看修改後的答案。 – Rob

相關問題