This tutorial is about spinning UIViews. Why spinning things you might ask? Animations can be (for a lack of better terminology because I hate this word) delightful for users.

Anywho, you might just need to animate a loading spinner thing or something for you app.

In this case, I’ve just created a few UIViews and added animation to it. If you want, you can even just use a UIImage component and spin that instead.

alt text

Tools:

Step 1: Create swift project Create a “Single View Application” project. If you don’t want extra folders in your project for testing, make sure you uncheck the items for tests.

alt text

Step 2: Add UIView to storyboard Search up the UIView component in the bottom left corner of Xcode and drag it into your storyboard.

After adding the component to your storyboard, change it’s color so that you can see it. It will default to white which can be difficult to see.

If you run this in the simulator at this point, all sorts of misalignments will happen here. This is because there are no constraints. alt text

Step 3: Add constraints* The first set of constraints that we’ll add here are “horizontal” and “vertical” constraints.

To do this make sure you have your UIView selected and then locate the icon at the bottom left of Xcode (look for the icon that look like sideways bar graphs). Then, check off the corresponding checkboxes.

alt text

The second set of constraints will be to give it a “width” and “height” constraint. To do this you need to find the square “Tie-fighter” icon at the bottom left of Xcode.

alt text

Once you add these two sets of constraints you’ll get a warning in the “Document Outline Panel”. Resolve these warnings as it will fix the placement of your UIView in your storyboard.

alt text

At this point if you run this in the simulator you’ll see that the UIView is centered in the middle of the screen in all rotations.

alt text

Step 4: Create and connect IBOutlets to your controller Now that you have your UIView set up, it’s time to create an “IBOutlet”. This is kind of like a variable that exists in the “Interface Builder” and gets connected to your code.

There are multiple ways of creating an “IBOutlet”. These are the two ways that I create them.

Version 1 You want to add an @IBOutlet in your view controller.

- Open `ViewController.swift` file
- Add “@IBOutlet weak var mySpinnerView: UIView!” to the class
- Go to the storyboard to connect UIView w/ IBOUTLET

Your code should look something like this:

import UIKit

class ViewController: UIViewController {

	@IBOutlet weak var mySpinnerView: UIView!

	override func viewDidLoad() {
		super.viewDidLoad()
		// Do any additional setup after loading the view, typically from a nib.
	}

	override func didReceiveMemoryWarning() {
		super.didReceiveMemoryWarning()
		// Dispose of any resources that can be recreated.
	}
}

You should also notice that there is a tiny unfilled dot next to your IBOutlet. This means that this outlet is not connected to anything in your storyboard.

To connect your newly created IBOutlet go back to your storyboard and then click on your view controller. Make sure you have your Utilities panel (right panel icon) open. Here, you will see that there is a list of outlets with unfilled dots as well. This is where you can click + drag to connect them. The dot should now be filled in.

alt text

Version 2 Open your storyboard and click on Show Assistant Editor (this is the venn-diagram-looking icon in the top of Xcode).

Ctrl + Click drag the UIView into your class and then name it. The dot should not be filled in.

alt text

alt text

Step 5: Add code to rotate forever In this example, we’re adding animation to spin a UIView once the app loads. To do that, we’ll create a function, then call that function within the viewDidLoad lifecycle function.

This is the function that contains the animation.

func beginAnimation () {
	UIView.animateWithDuration(1.0, delay: 0, options: .CurveLinear, animations: { () -> Void in
		self.mySpinnerView.transform = CGAffineTransformRotate(self.mySpinnerView.transform, CGFloat(M_PI))
	}) { (finished) -> Void in
		self.beginAnimation()
	}
}

Add code in your viewDidLoad to start the spinning

self.beginAnimation()

Your file should look like this:

import UIKit

class ViewController: UIViewController {

	// 1. We just added this IBOutlet
	@IBOutlet weak var mySpinnerView: UIView!

	override func viewDidLoad() {
		super.viewDidLoad()

		// 3. Starting animation when app loads
		self.beginAnimation()
	}

	override func didReceiveMemoryWarning() {
		super.didReceiveMemoryWarning()
		// Dispose of any resources that can be recreated.
	}

	// 2. Function to spin foreverrrr
	func beginAnimation () {
		UIView.animateWithDuration(1.0, delay: 0, options: .CurveLinear, animations: { () -> Void in
			self.mySpinnerView.transform = CGAffineTransformRotate(self.mySpinnerView.transform, CGFloat(M_PI))
		}) { (finished) -> Void in
			self.beginAnimation()
		}
	}
}

And that should be it. When you reload your simulator you should see a rotating pink square. Play around and add more spinning things!

You can get the storyboard project is in this repo.




Categories