swiftuianimationuikit-dynamicsuidynamicanimator

Swift UIImage cant be animated with gravity


I've looked into everything on Google, and that is not much. Is the community for Swift really this small???

I have an image, and on a long-press, I want it to fall down with gravity and hit the bottom of the screen.

The error I get is

Cannot convert value of type 'UIView' to expected argument type '[UIDynamicItem]'

I have tried UILabel, UIImage, UIImageView, Rect, UIView i get this error on what ever i do. My goal is to use UIImage or UIImageView.


This is the code I'm using for the animation:

    var animator: UIDynamicAnimator!
    var gravity: UIDynamicBehavior!
    var collision : UICollisionBehavior!

    var redBoxView: UIView?
    @IBOutlet weak var detailsImageWeather: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        animator = UIDynamicAnimator(referenceView: self.view)
        let imageTap = UILongPressGestureRecognizer(target: self, action: #selector(imageTapped))
        detailsImageWeather.addGestureRecognizer(imageTap)
    }

    @objc func imageTapped() {
        var frameRect = CGRect(x: 150, y: 20, width: 60, height: 60)
        redBoxView = UIView(frame: frameRect)
        redBoxView?.backgroundColor = UIColor.red
        self.view.addSubview(redBoxView!)

        let image = detailsImageWeather.image // This is what i want to use instead of redBoxView
        gravity = UIGravityBehavior(items: redBoxView!)
        animator.addBehavior(gravity)

        collision = UICollisionBehavior (items: redBoxView!)
        collision.translatesReferenceBoundsIntoBoundary = true
        animator.addBehavior(collision)

        let behavior = UIDynamicItemBehavior(items: [redBoxView!])
        behavior.elasticity = 2
    }

What am i doing wrong? cant find any more things to try on google


Solution

  • The error

    Cannot convert value of type 'UIView' to expected argument type '[UIDynamicItem]'

    tells that you need an array of UIDynamicItem. It's easy to miss the little square brackets.

    You're actually configuring your UIGravityBehavior and UICollisionBehavior with redBoxView (an object) instead of [redBoxView] (an array). That's why you get the error.


    You need to change your configurations to this

    gravity = UIGravityBehavior(items: [redBoxView!]) //redBoxView passed in an array
    

    and this

    collision = UICollisionBehavior (items: [redBoxView!]) //redBoxView passed in an array