2014-12-26 2 views
3

Как пользователь нажимает на супервизор, я обнаруживаю его через UITapGestureRecognizer и вызывая функцию внизу, чтобы создать вид UIImage, добавить его в супервизор, добавить к нему гравитацию и позволить ему выпасть из супервизора.Как заставить несколько UIImages падать одновременно с гравитацией?

Проблема заключается в том, что если пользователь снова забирает, когда первый 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

причина первая анимация останавливается в том, что когда вы вызываете этот раз, вы инстанцирование нового аниматор и отпускание старого. вы должны создать экземпляр аниматор только один раз. Точно так же , вы должны создать экземпляр гравитации только один раз.

С точки зрения прекращения поведения, когда представление отключено, одним из способов является добавление блока для поведения, повторение элементов поведения и просмотр того, все ли они на экране, и удалить элемент из списка поведения пунктов, когда элемент падает с экрана.

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 Да, я просто это увидел. Поэтому добавьте гравитацию один раз, а затем просто добавьте элемент в массив 'items' гравитации. И определите «действие», которое удаляет элементы, когда «фрейм» элемента больше не пересекает «границы» своего «супервизора». См. Пересмотренный ответ. – Rob