iOS 8: 在竖屏模式下显示模态视图控制器,会导致横屏导航控制器下方的导航栏大小改变。

9
在iOS 8上,我遇到了一种关于导航栏和方向变化的奇怪行为。
我有一个导航控制器,它报告支持界面方向UIInterfaceOrientationMaskLandscapeRight。导航栏在横向方向下具有预期的高度(不幸的是,我没有权利发布截图)。
然后,我启动了一个模态视图控制器的演示,该控制器仅支持UIInterfaceOrientationMaskPortrait。当演示动画开始时,似乎底层导航控制器的度量被更改为纵向呈现,因为导航栏的高度增加到其纵向大小,如上所示。
iOS 7不表现出这种行为。我错过了什么?我想恢复旧的行为。
以下是上述简单示例的完整代码:
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];


    DOGButtonViewController *root = [DOGButtonViewController new];
    DOGOrientedNavigationController *navi = [[DOGOrientedNavigationController alloc] initWithRootViewController:root];
    navi.allowedInterfaceOrientations = UIInterfaceOrientationMaskLandscapeRight;

    self.window.rootViewController = navi;

    [self.window makeKeyAndVisible];
    return YES;
}

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortrait;
}

@end


@implementation DOGOrientedNavigationController

- (NSUInteger)supportedInterfaceOrientations
{
    return self.allowedInterfaceOrientations;
}

@end

@implementation DOGButtonViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = @"Button View Controller";
}

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

- (IBAction)buttonClicked:(id)sender
{
    DOGPortraitViewController *vc = [DOGPortraitViewController new];
    [self presentViewController:vc animated:YES completion:nil];
}

@end

@implementation DOGPortraitViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = @"Portrait Title";
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

- (IBAction)buttonClicked:(id)sender
{
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

@end

在一个更加复杂的设置中,当呈现竖屏模态时,导航控制器中包含的UIWebView中的文本也会被放大。但是在关闭模态窗口时,文本不会恢复到原始大小。

你找到解决方案了吗?我也遇到了同样的问题。 - Luis E. Prado
很遗憾,但我会在接下来的几天里研究一下这个问题。 - thewulf
这里有类似的问题。看起来呈现的视图控制器也在旋转(虽然不应该)。 - Carlos
你找到解决方法了吗?我也遇到了同样的问题,从纵向切换到横向时出现了问题。 - doxsi
1个回答

0
由于没有更好的选项,我对此进行了一些黑客攻击。 基本上,在显示模态视图之前,我会截屏并将其放在呈现视图控制器的顶部。
显然,当视图重新出现时,我必须删除这个屏幕截图。
  func showScreenShot () {
    let image = screenShot()
    self.screenShotImageView = UIImageView(image: image)
    self.view.addSubview(self.screenShotImageView!)
  }

func screenShot () -> UIImage {
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, true, UIScreen.mainScreen().scale)
    self.view.layer.renderInContext(UIGraphicsGetCurrentContext())
    let image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image
}

func removeScreenShot () {
  if let screenImageView = self.screenShotImageView {
   screenImageView.removeFromSuperview()
   self.screenShotImageView = nil
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接