Ios7 iOS 7:自定义容器视图控制器,UINavigationController作为子视图控制器

Ios7 iOS 7:自定义容器视图控制器,UINavigationController作为子视图控制器,ios7,uiviewcontroller,uinavigationbar,uicontainerview,ios7-statusbar,Ios7,Uiviewcontroller,Uinavigationbar,Uicontainerview,Ios7 Statusbar,我想编写一个定制的全屏容器视图控制器,目的是将UINavigationController作为子视图控制器放入其中。UINavigationController的视图将填充容器视图控制器的视图,以便看起来UINavigationController是根视图控制器。(比如说,你可能想做一些类似的事情来创建Facebook普及的滑动侧边栏菜单UI。) 我所做的一切都很有效,只是在展示另一个视图控制器时出现了一个小故障,当iPhone处于横向时,该控制器会隐藏状态栏。通常,当状态栏消失时,导航栏会向上

我想编写一个定制的全屏容器视图控制器,目的是将UINavigationController作为子视图控制器放入其中。UINavigationController的视图将填充容器视图控制器的视图,以便看起来UINavigationController是根视图控制器。(比如说,你可能想做一些类似的事情来创建Facebook普及的滑动侧边栏菜单UI。)

我所做的一切都很有效,只是在展示另一个视图控制器时出现了一个小故障,当iPhone处于横向时,该控制器会隐藏状态栏。通常,当状态栏消失时,导航栏会向上滑动,当状态栏重新出现时,导航栏会向下滑动。相反,当导航栏应该向上滑动时,它会停留在原来的位置;当导航栏应该向下滑动时,它会首先放置在与状态栏重叠的位置,然后跳转到状态栏下方的正确位置。基本上,我试图让UINavigationController的行为与它不在自定义容器视图控制器中时的行为相同

下面是一些代码,您可以运行这些代码来查看问题,但是如果您不想这样做,请查看ContainerViewController类,它实现了一个最小的自定义容器视图控制器导致此问题的自定义容器视图控制器中缺少了什么?当我使用UITabBarController作为容器视图控制器时,它会起作用,因此我的实现中似乎缺少了一些东西

如果您愿意,请阅读下面的更多内容 如果您想运行示例代码来查看问题,下面是一个概述。AppDelegate中定义了一个名为MODE的预处理器定义,以三种方式有条件地编译应用程序

  • 模式==1时,ViewController位于UINavigationController内。然后,您可以按“显示”按钮以显示状态栏隐藏的ViewControllerWithStatusBarHidden,然后按“解除”按钮以解除此视图控制器。应用程序的这种模式显示了我正在寻找的行为

  • 模式==2时,除了UINavigationController位于ContainerViewController内部之外,我们拥有与模式==1相同的功能。应用程序的这种模式显示了我目前的不良行为

  • 模式==3时,我们与模式==1中的情况相同,只是UINavigationController位于UITabBarController内部。应用程序的这种模式表明,有可能获得我正在寻找的行为

同样,要查看问题,只需在iPhone处于横向时按“显示”按钮,然后按“取消”按钮

代码 四类:

  • ContainerViewController
  • AppDelegate
  • 视图控制器
  • ViewControllerWithStatusBarHidden
  • ContainerViewController.h

    #import <UIKit/UIKit.h>
    
    @interface ContainerViewController : UIViewController
    
    @property (nonatomic) UIViewController * viewController;
    
    @end
    
    #import <UIKit/UIKit.h>
    
    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    
    @property (strong, nonatomic) UIWindow *window;
    
    @end
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController
    
    @end
    
    #import <UIKit/UIKit.h>
    
    @interface ViewControllerWithStatusBarHidden : UIViewController
    
    @end
    
    AppDelegate.h

    #import <UIKit/UIKit.h>
    
    @interface ContainerViewController : UIViewController
    
    @property (nonatomic) UIViewController * viewController;
    
    @end
    
    #import <UIKit/UIKit.h>
    
    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    
    @property (strong, nonatomic) UIWindow *window;
    
    @end
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController
    
    @end
    
    #import <UIKit/UIKit.h>
    
    @interface ViewControllerWithStatusBarHidden : UIViewController
    
    @end
    
    ViewController.h

    #import <UIKit/UIKit.h>
    
    @interface ContainerViewController : UIViewController
    
    @property (nonatomic) UIViewController * viewController;
    
    @end
    
    #import <UIKit/UIKit.h>
    
    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    
    @property (strong, nonatomic) UIWindow *window;
    
    @end
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController
    
    @end
    
    #import <UIKit/UIKit.h>
    
    @interface ViewControllerWithStatusBarHidden : UIViewController
    
    @end
    
    ViewControllerWithStatusBarHidden.h

    #import <UIKit/UIKit.h>
    
    @interface ContainerViewController : UIViewController
    
    @property (nonatomic) UIViewController * viewController;
    
    @end
    
    #import <UIKit/UIKit.h>
    
    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    
    @property (strong, nonatomic) UIWindow *window;
    
    @end
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController
    
    @end
    
    #import <UIKit/UIKit.h>
    
    @interface ViewControllerWithStatusBarHidden : UIViewController
    
    @end
    

    不是一个直接的答案,但是你看过SWRevealViewController()了吗?听起来它像是在做你想做的事情。如果不是,它是开源的,所以你可以看到它是如何做到的!我将代码插入了SWRevealViewController的一个示例项目中,但我遇到了相同的问题。@user2135004:找到解决方案了吗?@BishalGhimire我找到了另一个可以接受的解决方案。当显示隐藏状态栏的视图控制器时,我只是将导航栏保持在与状态栏不隐藏时相同的大小和位置。这是通过对导航栏进行子类化来实现的:在设置中心、边界或帧的方法中,我在将参数传递给super之前调整参数。但是,由于这可能会弄乱它,因此扩展其背景以在状态栏的下方显示,我将覆盖drawRect,而不做任何事情来清除状态栏。我将一个虚拟导航条放在真实导航条下,以提供背景并使用autolayout对其进行定位。