关于iOS 6 部分UIViewController 转屏问题

来源:互联网 发布:怎么在淘宝上开书店 编辑:程序博客网 时间:2024/06/04 18:07


最近做一个项目 需要在UINavigationController下部分UIViewController 支持转屏功能。搜集了一下iOS 关于转屏的API:


// Applications should use supportedInterfaceOrientations and/or shouldAutorotate..- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation NS_DEPRECATED_IOS(2_0, 6_0);// New Autorotation support.- (BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0);- (NSUInteger)supportedInterfaceOrientations NS_AVAILABLE_IOS(6_0);// Returns interface orientation masks.- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation NS_AVAILABLE_IOS(6_0)


根据以往的经验,在iOS6以下的系统中,我们只需要实现:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
这个方法,然后在不同的UIViewController 实现不同的转屏方向:

// Note that UIInterfaceOrientationLandscapeLeft is equal to UIDeviceOrientationLandscapeRight (and vice versa).// This is because rotating the device to the left requires rotating the content to the right.typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {    UIInterfaceOrientationPortrait           = UIDeviceOrientationPortrait,    UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,    UIInterfaceOrientationLandscapeLeft      = UIDeviceOrientationLandscapeRight,    UIInterfaceOrientationLandscapeRight     = UIDeviceOrientationLandscapeLeft};
注意:UINavigationController 需要在RootViewController中实现该方法才起作用;UITabBarController同理。

而到了iOS 6.0及以上的系统,该方法已经过期,同样需要转屏的话需要现实一下API:

// New Autorotation support.- (BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0);- (NSUInteger)supportedInterfaceOrientations NS_AVAILABLE_IOS(6_0);

同样需要在UINavigationController 或者 UITabBarController的RootViewController中实现;

但然后在需要转屏的UIViewController 转成与之前UIViewController 转屏方向不同的情况下后退就会出现问题;

必须采用API:

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion NS_AVAILABLE_IOS(5_0);

做到转屏退出以后还是原来的UIViewController 维持原来的转屏方向;

如果想做到无缝UINavigationViewController 的push & pop效果的话:

参考以下代码:

push:

__block PhotoViewController *photoBrowser = [[PhotoViewController alloc] initWithDelegate:self];    photoBrowser.displayActionButton = YES;    photoBrowser.isCustom = YES;    photoBrowser.galleryItem = myGalleryList_;        if([[[UIDevice currentDevice] systemVersion] floatValue] > 5.9){        BlankViewController *blank =  [[BlankViewController alloc] init];        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:blank];               id vController = [[self.navigationController viewControllers] lastObject];        if (vController != self){            [self.navigationController popViewControllerAnimated:NO];        }        [self presentViewController:nav animated:NO completion:^{            [nav pushViewController:photoBrowser animated:YES];            [self setHidesBottomBarWhenPushed:YES];            [self.navigationController pushViewController:blank animated:NO];        }];    }else{        [self.navigationController pushViewController:photoBrowser animated:YES];    }

pop:

    if ([[[UIDevice currentDevice] systemVersion] floatValue] > 5.9){        if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){            [(UINavigationController *)[(AppDelegate *)fccsDelegate myTabBar].selectedViewController popViewControllerAnimated:NO];            [self dismissViewControllerAnimated:YES completion:^{            }];        }else{            [self dismissViewControllerAnimated:NO completion:^{                [(UINavigationController *)[(AppDelegate *)fccsDelegate myTabBar].selectedViewController popViewControllerAnimated:YES];            }];        }    } else {        [self.navigationController popViewControllerAnimated:YES];    }