由于IOS的横竖屏设置只有在根视图才会有效果。所以 想了一个方法就是找到根视图,添加一个类函数,在任何地方都去设置横竖屏的参数。

下边的例子是指定窗口横屏,其他竖屏显示。

1.找到根视图类,添加属性。我的demo工程根视图是 MyTabBarViewController 所以就在MyTabBarViewController中添加


static UIInterfaceOrientationMask orientation =UIInterfaceOrientationMaskPortrait;

添加类函数


+(void)setViewOrientation:(UIInterfaceOrientationMask)orientations{
 
    orientation = orientations;

}

重载函数


// 指定支持的旋转情况,须在最底层的viewcontroller实现
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    returnorientation;
}



2.在要单独设置横屏的界面添加代码


[MyTabBarViewControllersetViewOrientation:UIInterfaceOrientationMaskLandscapeRight |UIInterfaceOrientationMaskLandscapeLeft];

 由于设备当时可能是竖屏显示效果,如果没有手机方向改变的事件触发,就算是设置了横竖屏参数也不会横屏显示需要添加代码,去横屏显示

 

if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)])
    {
        SEL selector = NSSelectorFromString(@"setOrientation:");
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
        [invocation setSelector:selector];
        [invocation setTarget:[UIDevice currentDevice]];
        int val = UIInterfaceOrientationLandscapeRight;
        [invocation setArgument:&val atIndex:2];
        [invocation invoke];
    }

  在该视图消失的时候,需要改回竖屏效果。同理需要添加代码

  

if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)])
    {
        SEL selector = NSSelectorFromString(@"setOrientation:");
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
        [invocation setSelector:selector];
        [invocation setTarget:[UIDevice currentDevice]];
        int val = UIInterfaceOrientationPortrait;
        [invocation setArgument:&val atIndex:2];
        [invocation invoke];
    }

综上所述:


- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor whiteColor]];
    [MyTabBarViewController setViewOrientation:UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft];
    if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)])
    {
        SEL selector = NSSelectorFromString(@"setOrientation:");
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
        [invocation setSelector:selector];
        [invocation setTarget:[UIDevice currentDevice]];
        int val = UIInterfaceOrientationLandscapeRight;
        [invocation setArgument:&val atIndex:2];
        [invocation invoke];
    }
    // Do any additional setup after loading the view.
}



-(void)viewWillDisappear:(BOOL)animated{

    [MyTabBarViewController setViewOrientation:UIInterfaceOrientationMaskPortrait];
    if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)])
    {
        SEL selector = NSSelectorFromString(@"setOrientation:");
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
        [invocation setSelector:selector];
        [invocation setTarget:[UIDevice currentDevice]];
        int val = UIInterfaceOrientationPortrait;
        [invocation setArgument:&val atIndex:2];
        [invocation invoke];
    }
}




Demo源码