IPhone - 解除模态视图控制器后 - 间隙留在页面顶部

Bri*_*ian 24 iphone model-view-controller objective-c uiviewcontroller uikit

启动应用程序时,如果用户没有存储登录信息,我想显示模态视图控制器以强制输入此信息.我通过反复试验发现,这必须发生在我的根视图控制器的viewDidAppear中.我试图将它放在viewDidLoad和viewWillAppear中,但是除非我将根视图控制器的视图分配给模态中使用的导航控制器的视图,然后导致其他问题,否则这些都不起作用...

所以我有:

- (void)viewDidAppear:(BOOL)animated
{
     NewAccountViewController *newAccountViewController = [[[NewAccountViewController alloc] initWithNibName:@"NewAccountViewController" bundle:nil] autorelease];

     UINavigationController *accountNavigationController = [[UINavigationController alloc] initWithRootViewController:newAccountViewController];
  [self presentModalViewController:accountNavigationController animated:YES];       
}
Run Code Online (Sandbox Code Playgroud)

在newAccountViewController中,我有一个简单的导航项按钮,用dismissModalViewController解除模态视图控制器.

这一切都有效,当模态被解除时,导航控制器中的视图可见,其导航项标题位于顶部....

但是,状态栏与蓝色导航项目栏顶部之间的状态栏大小相同.如果我不做模态,那么差距永远不存在.它仅在模态呈现和解除后发生.我试过做动画:现在和dismissModalViewController都没有.我也试过在模态中不使用导航控制器,这也没有做任何事情.任何想法都会很棒!谢谢.

Tyl*_*ler 12

我有同样的问题.我的解决方案是在切换视图之前暂时关闭状态栏:

- (void) temporarilyHideStatusBar {
  [[UIApplication sharedApplication] setStatusBarHidden:YES];
  [self performSelector:@selector(showStatusBar) withObject:nil afterDelay:0];
}
- (void) showStatusBar {
  [[UIApplication sharedApplication] setStatusBarHidden:NO];
}

// Use these by calling the hide function just before a broken view switch:
[self temporarilyHideStatusBar];
[self doViewSwitch];

// No need to call [self showStatusBar]; explicitly.
Run Code Online (Sandbox Code Playgroud)

我尝试了其他基于代码的解决方案,我最喜欢这个解决方案,因为它可以100%的时间工作 - 我的一些基于框架的解决方案只能在大部分时间工作 - 而且因为它具有最小的用户可见效果.

我怀疑这是一个Apple漏洞,听听他们关于最好的解决方法的官方消息会很高兴.

  • 我发现这在某些情况下有效,而在其他情况下无效.当我不会遇到相同模态视图控制器的问题时,当模态视图控制器关闭时,它会将底层导航控制器推到状态栏下面.要解决此问题,我的标签栏控制器会显示模态视图控制器,而不是创建标签栏控制器的视图控制器. (2认同)

Bri*_*ian 9

事实证明这种情况正在发生,因为我在当前视图控制器上调用了我的modalviewcontroller,但我的视图控制器已经将另一个视图控制器作为子视图加载.一旦我改变它以在子视图中制作视图控制器,加载模态,然后它就消失了.感谢你的帮助.

  • 完全不可理解的答案. (13认同)

Mar*_*ark 6

我遇到了同样的问题.不确定是什么导致它,但我在解除模态视图后用以下代码行修复它:

[self.view setFrame:CGRectMake(0, 10, self.view.frame.size.width, self.view.frame.size.height)];
Run Code Online (Sandbox Code Playgroud)

只需调整Y偏移即可满足您的需求.在另一个例子中,我不得不把它变成20而不是10.