当用户点击超级视图时,我会通过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)
}
答案 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)