Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone UINavigationController出现故障(UINavigationBar位于错误位置)_Iphone_Uinavigationcontroller - Fatal编程技术网

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的框架,而是窗口内视图的框架。如果有用的话,我可以告诉你,我从来没有设置过窗框,也从来没有遇到过任何问题。但是,如果您在其他视图的定位方面仍然存在问题,您可以提出另一个问题。我很想看看其他视图的代码。