最近在本身的项目里面 有须要作一个需求 : app中某一个页面支持横竖屏, 而其余页面只能竖屏。
实现方法以下:
1 首先须要Xcode中选中支持的屏幕方向 app
2 Appdelegate中
.h测试
@property (nonatomic,assign)NSInteger allowRotate;
.m中ui
//此方法会在设备横竖屏变化的时候调用 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { // NSLog(@"方向 ============= %ld", _allowRotate); if (_allowRotate == 1) { return UIInterfaceOrientationMaskAll; }else{ return (UIInterfaceOrientationMaskPortrait); } } // 返回是否支持设备自动旋转 - (BOOL)shouldAutorotate { if (_allowRotate == 1) { return YES; } return NO; }
3 在须要支持横竖屏的controller中:atom
viewWillApplear 中lua
//在视图出现的时候,将allowRotate改成1, AppDelegate * delegate = (AppDelegate *)[UIApplication sharedApplication].delegate; delegate.allowRotate = 1;
viewWillDisappear中spa
//在视图出现的时候,将allowRotate改成0, AppDelegate * delegate = (AppDelegate *)[UIApplication sharedApplication].delegate; delegate.allowRotate = 0;
写好以上代码以后, 会发现一些问题: 当横屏页面直接点击“返回”按钮退出的时候, 页面依然是横屏, 而咱们须要的是仅一个页面能够横屏,测试须要在viewWillDisappear中加入以下代码:code
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]; }
此时就能够使app仅有设置页面支持横竖屏了!图片
此时若是app要求用户在横屏 竖屏的模式下改变UI(横屏与竖屏对应不一样的UI), 能够在如下方法中执行get
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { // do something before rotation if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { 屏幕从竖屏变为横屏时执行 }else{ 屏幕从横屏变为竖屏时执行 } } - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { // do something after rotation }