如何让多个UIImages同时受重力影响?

时间:2014-12-26 14:18:05

标签: ios swift uikit-dynamics

当用户点击超级视图时,我会通过UITapGestureRecognizer检测它并调用以下函数来创建UIImage视图,将其添加到超级视图,为其添加重力并让它脱离超级视图

问题是如果用户在第一个UIImage仍然在屏幕上时再次点击,则第一个图像暂停,第二个UIImage开始下降。让多个UIImage独立出现在屏幕上的最佳方法是什么。

其次,我觉得,我应该从superview中移除这些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)
}

1 个答案:

答案 0 :(得分: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)