I could rotate my tabbarcontroller app in every orientation previously - however - as I have now exceeded the set amount of fixed tabbaritems the tabbarcontroller has automatically added the'moreviewcontroller' and now the app wont change its orientation (I imagine as the more view controller has not been set the "shouldAutorotateToInterfaceOrientation" return value.
where if possible can I set it to allow for device orientation.
or is this not supported?
Thanks in advance.
It should still just handle it. Are you absolutely sure all of your view controllers are returning YES for shouldAutorotateToInterfaceOrientation:? Are they all the top level VCs that are in your UITabBarController, or are any of them now wrapped in something else which isn't supporting rotation?
Related
The app was perfectly fine working in iOS5 in landscape orientation. However in iOS6, it started to use portrait orientation in all view controllers. The methods shouldAutorotateToInterfaceOrientation are not called anymore. I read the new stuff about changed rotation mechanism in iOS6 and I was able to fix that by adding a line in my AppDelegate:
self.window.rootViewController = _viewController
_viewControler is the starting screen (Home-menu). All other view controllers implement shouldAutorotateToInterfaceOrientation method and returns YES for landscape orientations only. So, it's perfectly working solution for the app that needs to support only one orientation.
However, the problem is I need one view controller (lets call it phone-VC) to be presented in portrait orientation. Now, if I want this view controller would be rotated then I need to return YES in Home-menu controller that is assigned to rootViewControler in appDelegate. However, I can't do that because this rootViewController is starting window that need to presented in landscape only, otherwise the layout with graphics in this window will break. But if I don't return YES from its shouldAutorotateToInterfaceOrientation (Home-menu) then the same method is not called in my view phone-VC that needs to be presented in portrait.
Any ideas? Does the assignation of rootViewController is mandatory in AppDelegate?
UPDATE: the problem exists on device (at least on iPhone4).
Yes, from iOS 6.0 onwards, you must have rootviewcontroller assigned to Windows.rootViewController. This controller will decide whether their children rotates or not. By default all orientations supported but you can restrict them by implementing shouldAutoRotate and supportedInterfaceOrientations delegate methods. I had an instance where I didn't have rootviewcontroller assigned to Windows in using MGSplitViewController which was adding viewcontroller as subview to window. I just needed to change it to make rootviewcontroller and all worked fine!
Check UIKit section on Apple documents - iOS 6.0 release notes.
I'm a new iOS programming and I'm developing a simple iPhone game that needs to run in landscape only. I've ...
set supported orientations in the target settings
added the req. plist item (initial interface orientation)
overridden shouldAutorotateToInterfaceOrientation to return YES only for landscape modes
.. and the app "looks" correct, but there are a few odd things going on.
Issue 1 - I'm trying to manually position my views and not rely on autolayout. I've got a UIView in a NIB that I'm loading that needs to be positioned 150px from the right edge of the screen. I have to get the UIViewController's view's height (not width) to correctly position it - like it's not rotated to landscape at this point in the code.
Issue 2 - Implementing a UINavigationController to go from the title screen to the game interaction. When I'm pushing the interaction UIViewController to the stack, it slides in from the right like it's supposed to. When I go back to the title by popping the interaction, it slides UP to the title. It's seems like it's rotating back to portrait?
I think there is something very basic that I'm missing, but I can't find it in my app code. I've gone over the lists for a landscape app but they don't mention more than the list above.
Are there any other things/settings/methods to override that I should be on the look out for?
You need to set shouldAutorotateToInterfaceOrientation in your other viewControllers as well. Especially the ones displayed inside your UINavigationController.
Issue 2:
Don't use many UIViewController's. Use one view controller. Create one main UIViewController and for other UIViewController's just do:
[mainviewcontrl presentModalViewcontroller: child_viewcontrl animated: YES];
For delete a child view controller, use
[child_viewcontrl dismissModalViewControllerAnimated: YES];
I am working on an iPhone app with a UINavigationController interface and there I want all views to ONLY allow default portrait rotation except for one. I know I can return 'NO' in the shouldAutoRotate method but basically when I am in the view that does allow rotation and go back to the previous view, the other views are then stuck in landscape as well. Any ideas?
you need to change status bar orientation when you go back to previous view.
It's a small but annoying issue. I'm using a navigation controller and it will not rotate. I was using the code before without a navigation controller and it was rotating beautifully. It isn't even calling "-(BOOL)shouldAutororateToInterfaceOrientation..." now so I'm at a bit of a loss.
Thanks in advance.
Edit: And yes I have "-(BOOL)canBecomeFirstResponder" set.
Edit2: I have it calling "-(BOOL)shouldAutororateToInterfaceOrientation..." now when the App first runs and at this point the screen is rotated but then when it shows the Navcontroller sets it back to portrait mode...
There's a problem with UIWindow propagating these events to view controllers other than the root one. If you're adding this controller directly to a UIWindow and it isn't the first one you've added, then add it to the root view instead.
Otherwise, you'll probably need to take a look at implementing your own rotation transformations. I've got a UIViewController subclass which does the heavy lifting for you on github here.
Your controller need to have return YES in:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Overriden to allow any orientation.
return YES;
}
Also if you have an UITabBarController, each controllers need that method to return YES.
My app has 4 tabs. All the view controllers support rotation, and indeed are rotated when I rotate the device. For one of the view controllers, I need to reposition some of the subviews upon rotation. I do this in willRotateToInterfaceOrientation of that view controller, and it works fine.
The problem comes when I switch to a different tab, then rotate the device, then go back to the original tab. It apparently has not received the rotation notification, since willRotateToInterfaceOrientation has not been called. So it seems as though only the "active" view controller gets notified that the device has rotated.
The question: how do you get all the view controllers (controlled by a TabBarController) to rotate?
Unfortunately this is a bug in iOS 3.x. It works fine in iOS 4.x. I've seen apps that manually keep track of orientation changes and then do the rotation manually for inactive viewcontrollers. Sucks.
Looking through the iOS 3.2 docs to make sure this works, there is a viewControllers property in UITabBarController. Try something like this:
for (UIViewController * viewController in tabBarController) {
// Do stuff here with each 'viewController'.
}
I recommend that you do something with the UIViewController's -shouldAutorotateToInterfaceOrientation: method but you may have another way in which you plan on achieving the rotation.
You should also check for the interface orientation in viewWillAppear method of the controller whose subviews frame you are changing.Because when you move to the new tab and rotate the device and now when you tap another tab the viewWillAppear method will we called and there you can change the frames accordingly.
I also faced the same problem which i sorted out using this approach