What are the differences between the interface orientation delegate methods - iphone

anyone can tell differences among
willRotateToInterfaceOrientation,
willAnimateRotationToInterfaceOrientation,
didRotateFromInterfaceOrientation,

iOS originally did all rotations in a two-step process. In iOS 3.0, a new/better one-step animation process was introduced. The methods you mention are called at different stages in rotation. Specifically,
willRotateToInterfaceOrientation:duration: is called whenever the view is going to rotate (using any rotation method), before any rotation is started. This method will be called on ANY version of iOS, ANY time a rotation is performed (on an actively-shown view)
willAnimateRotationToInterfaceOrientation:duration: is called during a one-step rotation operation, just before the animation is drawn. This will only be called on iOS 3.0+.
didRotateFromInterfaceOrientation: is called at the end of a rotation operation (using any rotation method), after the rotation is complete. This method will be called on ANY version of iOS, ANY time a rotation is performed (on an actively-shown view).
In practice, on any modern (3.0+) iOS, all three methods are sent to the view controller of the actively-shown view. The methods are called in the order listed:
willRotateToInterfaceOrientation:duration: first
willAnimateRotationToInterfaceOrientation:duration: second,
didRotateFromInterfaceOrientation: last
Note: iOS 5 deprecates the other rotation-notification methods (dealing with the two-step animation process), so these three are the only ones that should be used in new projects.

From the UIViewController Class Reference:
willRotateToInterfaceOrientation:duration:
Sent to the view controller just
before the user interface begins
rotating.
willAnimateRotationToInterfaceOrientation:duration:
Sent to the view controller before
performing a one-step user interface
rotation.
didRotateFromInterfaceOrientation:
Sent to the view controller after the
user interface rotates.

The most significant difference I think is when method willRotateToInterfaceOrientation:duration: is called the self.view.bounds doesn't change but when method willAnimateRotationToInterfaceOrientation:duration: is called self.view.bounds has changed

Related

showing touches on iOS device like in the simulator

For the purposes of making app demos and presentations, I would like to draw circles corresponding to touches, just like in the iOS simulator, but on the device itself.
Ideally, this would be orthogonal to other code. Perhaps a UIView which draws the circles and forwards the events, but event forwarding seems to require the other views be aware:
http://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html#//apple_ref/doc/uid/TP40009541-CH3-SW17
Is there a clean way of doing this?
(I can't use the simulator for demos because my app uses gestures, MIDI, and OpenGL)
thanks!
There is a framework call fingertips which is available through cocoapods.
http://cocoapods.org/?q=on%3Aios%20fingertips
This will do what you are asking.
I don't think there's a clean way of doing this. However, this is what I would try:
Use method swizzling to hook up to all your views by swizzling the methods
- touchesBegan:withEvent:
– touchesMoved:withEvent:
– touchesEnded:withEvent:
for the UIView class. In addition, you may also need to swizzle some methods of UIGestureRecognizer subclasses, since they may prevent the methods listed above from being called. This way you can do your own thing (e.g. draw the touch points on the screen), and also let the views handle the touches as before.

Are animations automatically removed from layers when switching viewcontrollers?

I've setup a simple CAKeyframeAnimation with infinite repeatcount and added it to a layer. All is fine except that the animation is removed when I switch to another tab (or very likely any other mechanism of changing the active view controller).
Is this documented anywhere, perhaps new in iOS 5, and is there another solution than starting the animation again in viewWillAppear? The timebase is irrelevant in this case, starting the animation from time 0 would be fine.
You should not perform any work with View while it is not on screen, because it's just waste of iPhone resources. Besides your application can get memory warning and view will be unloaded.
IMHO the best approach is to set up graphics in -(void) viewWillAppear and start animations in -(void) viewDidAppear.
P.S. In -(void) viewDidLoad parameters of frame of view are still not valid and if you try to use them, you can get something wrong.

UI Automation: which delegate methods are called when scrolling in a scrollview

I'm new to UIAutomation introduced by iOS4. I'm scripting a test which requires to scroll in a scrollview.
So UIAScrollView has the following methods:
scrollUp
scrollDown
scrollLeft
scrollRight
scrollToElementWithName
scrollToElementWithPredicate
scrollToElementWithValueForKey
I want to know which UIScrollView delegate methods are invoked in the app when using these functions in my script.
UI Automation has nearly nothing to do with your Application in fact you can even run automation for apps that aren't yours. Indeed you have to know the accessibility label for each element. Therefore it should call the normal UIScrollViewDelegate which contains:
Responding to Scrolling and Dragging
– scrollViewDidScroll:
– scrollViewWillBeginDragging:
– scrollViewDidEndDragging:willDecelerate:
– scrollViewShouldScrollToTop:
– scrollViewDidScrollToTop:
– scrollViewWillBeginDecelerating:
– scrollViewDidEndDecelerating:
Managing Zooming
– viewForZoomingInScrollView:
– scrollViewWillBeginZooming:withView:
– scrollViewDidEndZooming:withView:atScale:
– scrollViewDidZoom:
Responding to Scrolling Animations
– scrollViewDidEndScrollingAnimation:
simply implement all into your application and NSLog() which one gets called.
Not sure if that's what you wanted to know.

Nested UIViewController does not respond to device rotation

I'm developing an app using a fork of LeavesViewController that changes to a two-page orientation when the device turns to landscape.
When using the Leaves controller alone, everything works fine.
When using the Leaves controller inside the view of my main UIViewController, it never gets any of the device rotation messages (however my main UIViewController does).
What can I do to make the Leaves controller reaceive the device rotation messages?
Thanks.
You're not supposed to nest UIViewControllers like that. In practice you can, but they're not managed by UIKit so you lose the functions that are usually called by the framework (viewWillAppear: and friends, I think).
You can forward the rotation methods yourself.

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.
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.
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.
I changed from willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: method to willAnimateRotationToInterfaceOrientation:duration: method and warning gone.
Thanks.
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.
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.
#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>
Need to add UIImagePickerController as a subview to solve this error
[self.view addSubview:picker.view];
[self presentModalViewController:picker animated:NO];
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.
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];
I've delete from plist "Supported interface orientations" row and warning disappears.
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,