Devoted
Devoted

Reputation: 183543

Single-Stage vs Two-Stage Animation for iPhone Apps?

What are single-state and two-stage animation for rotating an iPhone window?

This is the "error" message I get in the Debugger Console (nothing crashes):

Using two-stage rotation animation. To use the smoother single-stage animation, this application must remove two-stage method implementations.

I was working through the book "Beginning iPhone Development: Exploring the iPhone SDK" by Apress (Dave Mark, Jeff LaMarche) on the Swap Project.

Upvotes: 16

Views: 20992

Answers (11)

chrisben
chrisben

Reputation: 955

I've had this issue after creating a tabbarcontroller with no view controllers inside (no tabs), this warning disappeared once I attached at least one view controller to it.

Upvotes: 1

Juan González
Juan González

Reputation: 1526

I just had the same problem. In my case was a silly mistake that I'm putting here just in case anyone else falls into that same issue.

In my tabbed app I remove one of the original ViewControllers and added a new one with Storyboard to create a "Settings" section.

This new VC had to be a table view VC and even I designed, compiled and run it without a problem, when I changed the orientation of the app I kept getting this “Using two-stage rotation animation” error.

My problem was that I forgot to change in the original .h file interface "UIViewController" for "UITableViewController".

Once this was done I changed on the Storyboard identity badge the class from the general value to my SettingsViewController and that was the end of it.

I hope it can help someone else. It took me a while to get to bottom of this.

Cheers,

Upvotes: 0

Vish
Vish

Reputation: 41

I changed from willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: method to willAnimateRotationToInterfaceOrientation:duration: method and warning gone.

Thanks.

Upvotes: 3

beryllium
beryllium

Reputation: 29767

I've delete from plist "Supported interface orientations" row and warning disappears.

Upvotes: 0

Jigar
Jigar

Reputation: 11

Need to add UIImagePickerController as a subview to solve this error

[self.view addSubview:picker.view];
[self presentModalViewController:picker animated:NO];

Upvotes: 1

casey
casey

Reputation: 1124

I wasn't over riding any of those two-step functions, but I was calling my own function when I received orientationChanged notifications, and I had this line of code in it. Commenting it out got rid of the warning and allowed the auto rotate to work properly. Auto rotate still worked with this line of code until iOS 4.2, then it broke completely. Spent a lot of time looking for why the built in autoRotate stopped working in 4.2. Maybe this will help someone else.

Commented out this line to make it work:
[[UIApplication sharedApplication] setStatusBarOrientation:currentOrientation animated:YES];

Upvotes: 0

Rob
Rob

Reputation: 4434

@plumiscles answer didn't quite work for me - there was no item called 'Supported Interface Orientations', probably b/c it is an old project. But you can get the same effect by editing the .plist file directly and adding this:

 <key>UIInterfaceOrientation</key>
  <string>UIInterfaceOrientationPortrait</string>

Upvotes: 1

jasontwong
jasontwong

Reputation: 29

If you're using iOS 4 and you're getting this warning, I found a way to get rid of it. In your info.plist, there is an item called "Supported interface orientations." Select which orientations your application supports and two-stage warnings will go away when bringing up the imagePicker.

Upvotes: 1

knaught
knaught

Reputation: 39

I have found the culprit in my case to be the UIImagePickerController (I also do not override any rotation animation):

[self presentModalViewController:imagePicker animated:YES];

Replacing imagePicker with a generic UIViewController doesn't generate any warnings.

Upvotes: 3

user385662
user385662

Reputation: 11

Ed Marty's answer is the correct one. The reason it will happen if you are not overriding any of the rotation animation is probably that you reply "YES" to shouldAutorotate.. for some view. If you do not implement rotation at all, then you should just not override the shouldAutorotate.. method. If you do override that method, then just override the single step rotation method as well and pass it along to the super.

Upvotes: 1

Ed Marty
Ed Marty

Reputation: 39700

Everything is explained in the UIViewController Class Reference. Especially check out the View Rotation section near the top.

From the reference:

Handling View Rotations

By default, the UIViewController class displays views in portrait mode only. To support additional orientations, you must override the shouldAutorotateToInterfaceOrientation: method and return YES for any orientations your subclass supports. If the autoresizing properties of your views are configured correctly, that may be all you have to do. However, the UIViewController class provides additional hooks for you to implement additional behaviors as needed.

To temporarily turn off features that are not needed or might otherwise cause problems during the orientation change, you can override the willRotateToInterfaceOrientation:duration: method and perform the needed actions there. You can then override the didRotateFromInterfaceOrientation: method and use it to reenable those features once the orientation change is complete.

If you want to perform custom animations during an orientation change, you can do so in one of two ways. Orientation changes used to occur in two steps, with notifications occurring at the beginning, middle, and end points of the rotation. However, in iPhone OS 3.0, support was added for performing orientation changes in one step. Using a one-step orientation change tends to be faster than the older two-step process and is generally recommended for any new code.

To add animations for a one-step orientation change, override the willAnimateRotationToInterfaceOrientation:duration: method and perform your animations there. To use the older two-step method, override one or both of the willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: and willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration: methods to configure your animations before each step. You must choose only one technique and override just the methods associated with that technique. If you override either method associated with the two-step technique, the view controller uses that technique by default.

Upvotes: 15

Related Questions