Modal View Controller force Landscape orientation in iOS 6

谁都会走 提交于 2019-12-12 07:54:35

问题


I have a UITabBarController presented in Portrait mode. On one of the tabs I have a button that shows a UIViewController modally (A simple storyboard segue performs the action).

I want this modal view to be shown in Landscape mode, but I can't get it to turn automatically.

I have this in the modal views controller

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}

I've added landscapeLeft to the .plist supported orientations (although this also allows the TabBar to be rotated which I don't want)

I've also added this to the ViewDidLoad of the modal view

[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft;

but I just can't get it to rotate by itself.

Thanks

EDIT ----

It seems shouldAutoRotate isn't even being called!

Also, I'm trying to detect the orientation and this code below always shows 2, regardless of orientation!

if ([[UIDevice currentDevice] orientation] == UIInterfaceOrientationPortrait) {
        NSLog(@"1");
        self.hostView.frame = CGRectMake(0, 60, 200, 255);
    } else {
        NSLog(@"2");
        self.hostView.frame = CGRectMake(0, 45, 480, 255);
    }

EDIT 2 ---

My bad. I guess I should have mentioned I was using iOS 6. The display rotates automatically on iOS 5. shouldAutorotateToInterfaceOrientation is deprecated so I need to read up on the new methods.


回答1:


iOS 6.0 Release Notes
"More responsibility is moving to the app and the app delegate. Now, iOS containers (such as UINavigationController) do not consult their children to determine whether they should autorotate. "

-(BOOL)shouldAutorotate of UIViewController under any Container (like UINavigationController) will not be called from IOS6.

Tried a solution with using Category to add method to existing UINavigationController Class.

inside the shouldAutorotate method, you can call shouldAutorotate method in each view controller of self.viewControllers. In fact, you can pass to your child view controller.




回答2:


If you want to force rotation in iOS6, your rootviewController should implement these methods:

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

- (BOOL)shouldAutorotate {
    return YES;
}



回答3:


In iOS 6 it seems to be this method may help force a specific orientation on iOS 6.

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

I am still trying to get it to work and will update with any findings.




回答4:


I do exactly this in my app, and do it via shouldAutoRotateToInterfaceOrientation, slightly differently than you:

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
 if (UIInterfaceOrientationIsLandscape(interfaceOrientation))
  return (YES);
 return (NO);
}

for iOS 6, you must also set window.rootViewController = {your root view controller}; in your app delegate. I'm hoping this is your issue



来源:https://stackoverflow.com/questions/12060534/modal-view-controller-force-landscape-orientation-in-ios-6

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!