在景观发布后不能强制查看以纵向开始

时间:2017-11-16 11:20:12

标签: ios objective-c orientation

HY, 我知道之前已经问过这个问题,但是我解决了所有的解决方案,没有解决我遇到的情况。

我的应用程序全部采用纵向格式,只有一个横向格式的视图控制器。

我向所有视图控制器添加了以下代码,以强制纵向方向,无论设备方向如何:

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
       return UIInterfaceOrientationMaskPortrait;
 }

 -(BOOL)shouldAutorotate{
      return NO;
 }
 - (UIInterfaceOrientationMask)supportedInterfaceOrientations
 {
      return UIInterfaceOrientationMaskPortrait;
 }

 -(void)ViewDidLoad()
 {
      [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
 }

如果设备设置为纵向模式,则viewController会正确打开,但如果设备在打开应用程序之前设置为横向模式,那么应用程序将启动横向启动画面并以部分视图打开横向视图控制器剪切,然后将其旋转到纵向模式,并保持屏幕的一部分被剪裁,如图所示。

enter image description here

在app delegate中:

 - (UIInterfaceOrientationMask)supportedInterfaceOrientations
 {
      return UIInterfaceOrientationMaskPortrait;;
 }

 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
 {
      return UIInterfaceOrientationMaskAllButUpsideDown;
 }

在appDelegate中,就在将视图控制器添加到导航控制器之前,我添加了以下内容:

[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationPortrait] forKey:@"orientation"];

感谢您就此问题提出任何建议。

如果有任何事情似乎不清楚或者可能需要任何信息,请澄清问题让我知道。

3 个答案:

答案 0 :(得分:2)

这似乎是自iOS 11以来的一件新事物。我通过允许自动旋转来修复它,但仅支持肖像。

(BOOL)shouldAutorotate{
      return YES;
}
(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
     return UIInterfaceOrientationMaskPortrait;
}

答案 1 :(得分:0)

好的,我做了什么,它最终运作良好,希望它可以帮助某人:

在appDelegate中

我正在提出以下内容:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

为了介绍我正在使用appDelegate中的以下主视图:

self.navigationController = [[UINavigationControllerSub alloc] initWithRootViewController:libraryVC];
navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;

portraitSize = CGSizeMake(navigationController.view.frame.size.width, navigationController.view.frame.size.height);

[self.window setRootViewController:navigationController]; 

在我从应用代表发起的主视图中,我需要它只是肖像我正在做以下事情:

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];
    [[UIApplication sharedApplication]     setStatusBarOrientation:UIInterfaceOrientationPortrait];
    [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationPortrait] forKey:@"orientation"];
    AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
    [appDelegate setShouldRotate:NO];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
}

当我想要启动一个我需要它成为风景的视图时,我在启动之前使用以下内容:

AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate setShouldRotate:YES];
[UIApplication sharedApplication].statusBarOrientation = UIDeviceOrientationLandscapeLeft;
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];

答案 2 :(得分:0)

您只需将项目设置为纵向即可确保无论设备的方向如何,应用均以纵向启动。

此外,请确保在AppDelegate上实现了supportedInterfaceOrientationsForWindow,并且它返回了UIInterfaceOrientationMaskAll或任何对您的项目有意义的掩码。

所有这些,您将使用纵向启动应用程序,并通过每个视图控制器控制允许的方向,并使用已有的实现。