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

用户点击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)

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...