iOS (9 &10) 应用程序不会颠倒旋转
iOS (9 &10) App does not rotate upside down
我遇到了麻烦,如果我将 phone 倒置,我的应用程序就会被迫倒置旋转。
我有一个包含两个场景的故事板文件:
NavigationControllerScenes and MainScene / SettingsScene
在 info.plist 中,我选中了以纵向或倒置方向开始的框。
在我添加的应用委托中:
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
#else
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
#endif
{
return UIInterfaceOrientationMaskPortrait;
}
在设置视图控制器中:
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation // iOS 6 autorotation fix
{
return UIInterfaceOrientationPortraitUpsideDown;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
- (BOOL)shouldAutorotate // iOS 6 autorotation fix
{
return YES;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000
- (NSUInteger)supportedInterfaceOrientations{
#else
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
#endif
{
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}
}
在主视图控制器中
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation // iOS 6 autorotation fix
{
return UIInterfaceOrientationPortraitUpsideDown;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
- (BOOL)shouldAutorotate // iOS 6 autorotation fix
{
return YES;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000
- (NSUInteger)supportedInterfaceOrientations
#else
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
#endif
{
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}
可以横向和纵向旋转,但不能上下颠倒纵向。
如果我取消选中 info.plist 中的纵向框并只选中倒置框,应用程序将在一开始就崩溃。
所以我认为缺少设置...
我不明白的是,我可以在不同的应用程序中成功地使用这些代码片段,只有一个场景 - 所以我认为错误来自多个场景。
也许我需要创建一个覆盖某些方法的 navigationController。
还有一件事:
这不起作用 - 应用程序执行语句但没有任何反应:
NSNumber * value = [NSNumber numberWithInt:UIInterfaceOrientationPortraitUpsideDown];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
在一个场景的应用程序中它有效!
最后我自己找到了答案:
创建一个 CustomNavigationController class 如下:
// .h file
#import <UIKit/UIKit.h>
@interface CustomNavigationController : UINavigationController
@end
// .m file
#import "CustomNavigationController.h"
@interface CustomNavigationController ()
@end
@implementation CustomNavigationController
- (BOOL)shouldAutorotate
{
return self.topViewController.shouldAutorotate;
}
- (NSUInteger)supportedInterfaceOrientations
{
return self.topViewController.supportedInterfaceOrientations;
}
@end
在故事板中单击导航控制器场景。
在自定义 class 部分添加创建的 class
as shown here
我遇到了麻烦,如果我将 phone 倒置,我的应用程序就会被迫倒置旋转。
我有一个包含两个场景的故事板文件: NavigationControllerScenes and MainScene / SettingsScene
在 info.plist 中,我选中了以纵向或倒置方向开始的框。
在我添加的应用委托中:
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
#else
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
#endif
{
return UIInterfaceOrientationMaskPortrait;
}
在设置视图控制器中:
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation // iOS 6 autorotation fix
{
return UIInterfaceOrientationPortraitUpsideDown;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
- (BOOL)shouldAutorotate // iOS 6 autorotation fix
{
return YES;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000
- (NSUInteger)supportedInterfaceOrientations{
#else
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
#endif
{
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}
}
在主视图控制器中
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation // iOS 6 autorotation fix
{
return UIInterfaceOrientationPortraitUpsideDown;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
- (BOOL)shouldAutorotate // iOS 6 autorotation fix
{
return YES;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000
- (NSUInteger)supportedInterfaceOrientations
#else
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
#endif
{
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}
可以横向和纵向旋转,但不能上下颠倒纵向。 如果我取消选中 info.plist 中的纵向框并只选中倒置框,应用程序将在一开始就崩溃。 所以我认为缺少设置...
我不明白的是,我可以在不同的应用程序中成功地使用这些代码片段,只有一个场景 - 所以我认为错误来自多个场景。 也许我需要创建一个覆盖某些方法的 navigationController。
还有一件事: 这不起作用 - 应用程序执行语句但没有任何反应:
NSNumber * value = [NSNumber numberWithInt:UIInterfaceOrientationPortraitUpsideDown];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
在一个场景的应用程序中它有效!
最后我自己找到了答案:
创建一个 CustomNavigationController class 如下:
// .h file
#import <UIKit/UIKit.h>
@interface CustomNavigationController : UINavigationController
@end
// .m file
#import "CustomNavigationController.h"
@interface CustomNavigationController ()
@end
@implementation CustomNavigationController
- (BOOL)shouldAutorotate
{
return self.topViewController.shouldAutorotate;
}
- (NSUInteger)supportedInterfaceOrientations
{
return self.topViewController.supportedInterfaceOrientations;
}
@end
在故事板中单击导航控制器场景。 在自定义 class 部分添加创建的 class as shown here