由于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源码