iPhone UINavigationController出现故障(UINavigationBar位于错误位置)
我正在对应用程序进行一些调整,包括更改为基于导航的界面。作为更改的一部分,我编写了一个视图控制器,其中包含一个iPhone UINavigationController出现故障(UINavigationBar位于错误位置),iphone,uinavigationcontroller,Iphone,Uinavigationcontroller,我正在对应用程序进行一些调整,包括更改为基于导航的界面。作为更改的一部分,我编写了一个视图控制器,其中包含一个UINavigationController。问题是,出于某种奇怪的原因,UINavigationController管理的UINavigationBar和UIToolbar从其应该的位置向下移动了20 px。我已经成功地制作了以下示例来演示这个问题: // MyAppDelegate.m @implementation MyAppDelegate @synthesize window
UINavigationController
。问题是,出于某种奇怪的原因,UINavigationController
管理的UINavigationBar
和UIToolbar
从其应该的位置向下移动了20 px。我已经成功地制作了以下示例来演示这个问题:
// MyAppDelegate.m
@implementation MyAppDelegate
@synthesize window = _window;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window.frame = [[UIScreen mainScreen] applicationFrame];
[self.window makeKeyAndVisible];
TestController* tc = [TestController new];
[self.window addSubview:tc.view];
return YES;
}
@end
// TestController.m
@implementation TestController
- (void)loadView
{
self.view = [[UIView alloc] initWithFrame:CGRectZero];
UINavigationController* navController = [UINavigationController new];
navController.view.backgroundColor = [UIColor blueColor];
[navController setToolbarHidden:NO animated:NO];
[self.view addSubview:navController.view];
}
@end
这将在我的机器上产生以下结果:
正如你所看到的,这些控件比我预期的要低20像素。我已经尝试了我能想到的一切(各种组合的wantsFullScreenLayout
,autoresizesSubviews
,等等),但没有任何积极的效果。这也与在编程上弄乱状态栏无关(我遇到的大多数其他例子似乎都是这样),因为我在任何时候都不会弄乱状态栏。无论导航控制器中是否有根视图控制器,都会发生这种情况-如果有根视图控制器,其内容也会向下移动20像素(因此它们实际上位于相对于导航栏和工具栏的正确位置)
非常感谢任何帮助
编辑:经过一番调查,似乎删除了行
self.window.frame=[[UIScreen mainScreen]applicationFrame]代码>似乎纠正了导航栏、工具栏和内容的位置。这就是说,现在应用程序中的一些其他视图位于错误的位置(状态栏下方)。我的理解是,通常建议使用线条来确保窗口大小正确?UINavigationController不能很好地用作子视图;正如您所注意到的,它通常会为状态栏留出空间,即使它实际上不在状态栏下。如果您不想编写自己的容器视图控制器,那么应该重新编写代码,使其不将视图控制器的视图添加为子视图
也就是说,我很幸运地通过在UINavigationController上将WantFullScreenLayout
设置为NO来修复它,这样就不会为状态栏留下空间。当然,您希望在分配完后,在触发loadView
之前执行此操作。如我的编辑中所述,删除行self.window.frame=[[UIScreen mainScreen]applicationFrame]代码>似乎已经纠正了我95%的问题。我已经设法通过对我的窗口使用相同的背景颜色来修复其他5%的问题,并且剩余的视图有问题,但是我不能说我对这个解决方案感到兴奋-我不应该这样做
我会继续尝试,如果我发现更好的结果,我肯定会在这里发布编辑。感谢您的及时回复。不幸的是,我正在尝试制作一个容器视图控制器来处理委托消息。我已经按照您的建议进行了尝试(通过在TestController
的init
方法中设置navController.wantsFullScreenLayout=NO
),但仍然得到了相同的结果。我想您解决了您的问题。这是另一个导致其他视图位置不正确的问题。在applicationFrame属性的UIScreen文档中:“此属性包含屏幕边界减去状态栏(如果可见)占用的区域。”但是,状态栏位于窗口中。因此,新窗口的框架重置在状态栏下方,仍然为状态栏留出空间,它希望状态栏位于其中。(顺便说一句,我不是专家,但我从未听说过这个建议,对我来说也没有任何意义。)@salo.dm:我似乎找不到我在哪里遇到了特定的代码行,但也从UIScreen
:的文档中找到了设置应用程序用户界面时遇到的代码,您应该使用此对象的属性来获取应用程序窗口的推荐帧矩形。
是的,这很混乱,但我仍然无法信服。如果一个窗口只有一个框架,当他们用复数形式说“框架矩形”时,他们指的是什么?也许他们指的不是UIWindow的框架,而是窗口内视图的框架。如果有用的话,我可以告诉你,我从来没有设置过窗框,也从来没有遇到过任何问题。但是,如果您在其他视图的定位方面仍然存在问题,您可以提出另一个问题。我很想看看其他视图的代码。