3

Aim:

How can I animate a UIView that I want to expand to fill the whole screen. The UIView needs to expand in smooth, even and balance way while it animates.

I have one red square positioned on screen, starts small then expands to fit the screen. (Image 1.)

let subview = UIView()
subview.backgroundColor = .red
subview.frame = CGRect(x: 60, y: 200, width: 50, height: 50)
self.view.addSubview(subview)

Question:

In Swift 2 and Swift 3, using an animateWithDuration, how do I animate the the red square UIView expanding in a balanced and even manner in all directions to fill the whole screen?

UIView.animateWithDuration(1.0, delay: 0, options: nil, animations: {

    ?????

}, completion: nil)

Image 1:

enter image description here

user4806509
  • 2,925
  • 5
  • 37
  • 72

2 Answers2

6

You can try this, I set the duration to 5 seconds but you got the idea.

let viewWidth = view.frame.width
let viewHeight = view.frame.height
UIView.animate(withDuration: 5) { 
    subview.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
}
Lawliet
  • 3,438
  • 2
  • 17
  • 28
3

It looks like you need to play with scale.

class ViewController: UIViewController {

var subview:UIView!

@IBOutlet weak var animateButton:UIButton!

override func viewDidLoad() {
    super.viewDidLoad()
    subview = UIView()
    subview.backgroundColor = .red
    subview.frame = CGRect(x: 60, y: 200, width: 50, height: 50)
    self.view.addSubview(subview)

    self.view.bringSubview(toFront: animateButton)
}

@IBAction func animateButtonPressed(sender:UIButton) {
    if(sender.tag == 0) {

        let screenCenter = CGPoint(x:UIScreen.main.bounds.midX, y: UIScreen.main.bounds.midY)
        let subviewCenter = self.view.convert(self.subview.center, to: self.view)
        let offset = UIOffset(horizontal: screenCenter.x-subviewCenter.x, vertical: screenCenter.y-subviewCenter.y)

        let widthScale = UIScreen.main.bounds.size.width/subview.frame.size.width
        let heightScale = UIScreen.main.bounds.size.height/subview.frame.size.height
        UIView.animate(withDuration: 1.0, animations: {
            let scaleTransform = CGAffineTransform(scaleX: widthScale, y: heightScale)
            let translateTransform = CGAffineTransform(translationX: offset.horizontal, y: offset.vertical)
            self.subview.transform = scaleTransform.concatenating(translateTransform)
        }, completion: { (finished) in
            sender.tag = 1;
        })

    } else {
        UIView.animate(withDuration: 1.0, animations: {
            self.subview.transform = CGAffineTransform.identity
        }, completion: { (finished) in
            sender.tag = 0;
        })
    }
}
}

enter image description here

Puneet Sharma
  • 9,369
  • 1
  • 27
  • 33