微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐