在一个模态视图控制器上强制 iOS 方向为横向
Force iOS orientation to landscape on one modal view controller
我有一个同时支持 iPad 和 iPhone 的通用应用程序。在 iPad 上,我支持所有方向,而在 iPhone 上,仅支持纵向。
我想要一个视图控制器(以模态方式显示),当 运行 在 iPhone 上时,以设备所在的任何方向显示。我已经看过很多教程和 SO建议使用 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
app delegate 方法的帖子,这在旋转模态视图控制器方面似乎非常有效。但是,当我在横屏模式下关闭模态视图时,整个应用程序仍然是横屏模式。
理想情况下,模式视图一被关闭,应用程序就应该返回纵向模式。
经过调查,似乎 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
回调在关闭视图控制器后没有被调用,我不明白为什么。
我玩过示例应用 here,关闭视图控制器时会触发回调,我不明白这是为什么。我能看到的唯一区别是我的视图层次结构要复杂得多,而且我显示的是导航控制器而不是显式视图控制器,但我看不出这应该如何影响回调。
关于找到解决方案的任何想法?
谢谢
在 appdelegate 中:
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
// Get topmost/visible view controller
UIViewController *currentViewController = [self topViewController];
//Hire check your needed device ore other things you need
if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone )
{
//device is iphone
if ([currentViewController respondsToSelector:@selector(canRotate)])
{
// Unlock landscape view orientations for this view controller
return UIInterfaceOrientationMaskAll;
}
return UIInterfaceOrientationMaskPortrait;
}
else
//device Ipad
return UIInterfaceOrientationMaskAll;
}
}
- (UIViewController*)topViewController {
return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}
- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
if ([rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController* tabBarController = (UITabBarController*)rootViewController;
return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
} else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController*)rootViewController;
return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
} else if (rootViewController.presentedViewController) {
UIViewController* presentedViewController = rootViewController.presentedViewController;
return [self topViewControllerWithRootViewController:presentedViewController];
} else {
return rootViewController;
}
}
在需要旋转的视图中确保实现
- (void)canRotate { }
这将允许您只旋转 iPhone 设备所需的视图。
我在旧的 Whosebug post 的帮助下得到了这段代码,但我现在找不到 link
您可以尝试使用此方法(在应用商店构建中工作):
[[UIDevice currentDevice] performSelector:@selector(setOrientation:)
withObject:(__bridge id)((void*)UIInterfaceOrientationPortrait)];
我有一个同时支持 iPad 和 iPhone 的通用应用程序。在 iPad 上,我支持所有方向,而在 iPhone 上,仅支持纵向。
我想要一个视图控制器(以模态方式显示),当 运行 在 iPhone 上时,以设备所在的任何方向显示。我已经看过很多教程和 SO建议使用 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
app delegate 方法的帖子,这在旋转模态视图控制器方面似乎非常有效。但是,当我在横屏模式下关闭模态视图时,整个应用程序仍然是横屏模式。
理想情况下,模式视图一被关闭,应用程序就应该返回纵向模式。
经过调查,似乎 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
回调在关闭视图控制器后没有被调用,我不明白为什么。
我玩过示例应用 here,关闭视图控制器时会触发回调,我不明白这是为什么。我能看到的唯一区别是我的视图层次结构要复杂得多,而且我显示的是导航控制器而不是显式视图控制器,但我看不出这应该如何影响回调。
关于找到解决方案的任何想法?
谢谢
在 appdelegate 中:
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
// Get topmost/visible view controller
UIViewController *currentViewController = [self topViewController];
//Hire check your needed device ore other things you need
if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone )
{
//device is iphone
if ([currentViewController respondsToSelector:@selector(canRotate)])
{
// Unlock landscape view orientations for this view controller
return UIInterfaceOrientationMaskAll;
}
return UIInterfaceOrientationMaskPortrait;
}
else
//device Ipad
return UIInterfaceOrientationMaskAll;
}
}
- (UIViewController*)topViewController {
return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}
- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
if ([rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController* tabBarController = (UITabBarController*)rootViewController;
return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
} else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController*)rootViewController;
return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
} else if (rootViewController.presentedViewController) {
UIViewController* presentedViewController = rootViewController.presentedViewController;
return [self topViewControllerWithRootViewController:presentedViewController];
} else {
return rootViewController;
}
}
在需要旋转的视图中确保实现
- (void)canRotate { }
这将允许您只旋转 iPhone 设备所需的视图。
我在旧的 Whosebug post 的帮助下得到了这段代码,但我现在找不到 link
您可以尝试使用此方法(在应用商店构建中工作):
[[UIDevice currentDevice] performSelector:@selector(setOrientation:)
withObject:(__bridge id)((void*)UIInterfaceOrientationPortrait)];