当用户点击superview时,我通过UITapGestureRecognizer检测它并调用下面的函数创建一个UI
Image视图,将其添加到superview,为它添加重力并让它脱离superview.
问题是如果用户在第一个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) }
解决方法
第一个动画停止的原因是当你再次调用它时,你正在实例化一个新的动画师并释放旧的动画师.您应该只实例化一次动画师.同样,您应该只重复一次重力.
在视图离开屏幕后停止行为方面,一种技术是为行为添加动作块,遍历行为的项目并查看每个项目是否仍然在屏幕上,并从行为的项目列表中删除项目该项目从屏幕上掉下来.
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)