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];
}
@chrishulbert
Copy link
Author

Maybe put my code into a separate helper class, and disable ARC on just that file (-fno-objc-arc), that'd be a simple approach.

@jdandrea
Copy link

jdandrea commented May 9, 2012

Yup, that's exactly what I did, and it works! Meanwhile, I'm running into trouble with the code in this gist (I know, finally back on topic - ha!), but only when it comes to the More controller. Here's what I'm using now in order to avoid running into UIMoreListController and UISnapshotModalViewController:

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     // For non-nav controllers
     UIViewController *vc = self.selectedViewController;

     // For nav controllers
     if ([vc isKindOfClass:[UINavigationController class]]) {
        UINavigationController *navController = (UINavigationController *) vc;
        vc = navController.topViewController;
     }

     // Exception for nav controllers under the more tab
     // NOTE: With the More tab, I have yet to see vc be nil here. Hmm.
     if (!vc) {
        vc = self.moreNavigationController.topViewController;
     }

     // OPTIONAL: If this is the More navigation controller or the first view 
     // on its stack (UIMoreListController), keep it at portrait.
     if (vc == self.moreNavigationController ||
         [vc isKindOfClass:NSClassFromString(@"UIMoreListController")]) {
         return (interfaceOrientation == UIInterfaceOrientationPortrait);
     }

     return [vc shouldAutorotateToInterfaceOrientation:interfaceOrientation];
 }

@chrishulbert
Copy link
Author

Its funny you should mention it, somewhere on my blog i wrote a post on how to find the active VC when the 'more' tab is selected. Its there...somewhere...

Anyway sounds like you've licked all your problems. Congrats.

@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