Skip to content

Instantly share code, notes, and snippets.

@chrishulbert
Created May 25, 2011 05:00
Show Gist options
  • Save chrishulbert/990371 to your computer and use it in GitHub Desktop.
Save chrishulbert/990371 to your computer and use it in GitHub Desktop.
Finding the currently visible view in a UITabBarController
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Firstly, we want to figure out who is the currently visible view controller.
// There are 4 possibilities here:
// 1- They could be a non-nav controller, with a visible tab (ie not under the 'more' tab)
// Simple: self.selectedViewController
// 2- They could be a nav controller, with a visible tab (ie not under the 'more' tab)
// Get it's visible view: self.selectedViewController.visibleViewController
// 3- They could be a non-nav controller, under the 'more' tab
// Simple: self.selectedViewController
// 4- They could be a nav controller, under the 'more' tab
// This is where it gets tricky (or buggy, really? You decide.)
// What UIKit does is: its sets the self.selectedViewController to your nav controller, but steals the root view and
// pushes it onto the self.moreNavigationController's stack
// So if your self.selectedViewController.viewControllers is empty, use self.moreNavigationController.visibleViewController
UIViewController *visible = self.selectedViewController; // For non-nav controllers
if ([visible respondsToSelector:@selector(visibleViewController)]) // For nav controllers
visible = [((UINavigationController*)visible) visibleViewController];
if (!visible) // Exception for nav controllers under the more tab
visible = self.moreNavigationController.visibleViewController;
return [visible shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}
@jdandrea
Copy link

Thanks! I really appreciate your patience and willingness to indulge me here in the comments.

As for that blog post, yep, that's how I arrived here. It's this one, right?

The thing that's got me confused now is that visibleController shouldn't work (at least certainly not on iOS 5, with those two private VCs that Apple exposes in there), but that's what you use in your code ... unless Apple changed something subtle as of iOS 5.

@chrishulbert
Copy link
Author

chrishulbert commented May 10, 2012 via email

@jdandrea
Copy link

Thanks, and you're 100% correct - I want to lose that More tab so badly, you have no idea.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment