在使用Xcode 4.5编译iOS 6 SDK时,视图会下降20像素。

9
在使用iOS 6.0 SDK构建我的iPad应用后,我的UISplitViewController的详细视图出现了奇怪的行为。详细视图的位置比它应该的低20像素(点/40像素)。
以下是在5.1下的样子:
针对Interface Builder中的DetailViewController_iPad.xib文件,我将模拟指标>顶栏设置为“None”,但这并没有帮助解决问题。 我已记录了视图框架:
- (void) viewDidLayoutSubviews {
//.. etc
NSLog(@"viewDidLayoutSubviews: %@", CGRectCreateDictionaryRepresentation(self.view.frame) );
}

此处记录的高度为684,而实际应为704。 Height = 684; Width = 703; X = 0; Y = 0; 有经验的人知道该怎么做吗?下一步该尝试什么?
更新:这个问题似乎是间歇性的,有些编译导致了这个问题,而其他的则没有。
如果有其他人遇到过这个问题并找到原因,请告知。

我遇到了类似的问题,但是我的UIView背景图片有20像素的底部可用空间。 - Claus
你是否正确设置了自动调整大小的掩码?(高度灵活,顶部和底部边框固定) - deanWombourne
@deanWombourne 是的,我已经做过了,但没有任何效果。 - MattyG
2
你能否建立一个演示项目并将其放在DropBox上,以便我们可以进行测试。不需要任何分割视图 - 只需要展示问题的项目即可。我刚在Xcode4.5中为iOS6创建了一个新项目,当然它运行得很完美。也许可以拿你原来的项目并删除所有不必要的内容。 - David H
1
你是使用xib还是storyboard? - brynbodayle
如果这仍然困扰着您,并且您的目标是6.0,您可以考虑探索新的自动布局功能 - 这有点像把一只死鸡扔到问题上,但它可能会帮助您度过这种情况。但是,只有在您的目标是6.0时才是一个选项。 - Rob Reuss
7个回答

9

我遇到了完全相同的问题!

当导航控制器中有另一个视图控制器并且在应用程序启动期间使用方法application:didFinishLaunchingWithOptions:将此分割视图控制器推入时,就会出现问题。

这个方法解决了我的问题:

在推送splitViewController时,我使用了以下方法:

dispatch_async(dispatch_get_main_queue(), ^{

     [self.navigationController pushViewController:splitViewController animated:NO];

})

代替

[self.navigationController pushViewController:splitViewController animated:NO];

我只在iOS6上使用了这个,否则第一个视图将在低于iOS6的操作系统上短暂显示。


刚在 iPhone 的 iOS 6 上遇到了类似的问题(iOS 5 没有问题),启动时推入导航控制器的模态视图不会显示在半透明状态栏后面。这个方法解决了问题。谢谢! - Hari Honor

2
我假设您在代码中没有对视图的框架进行任何更改,是视图的控制器在进行所有的布局吗?如果是这样的话,您是否尝试过调整-wantsFullScreenLayout属性?
当一个视图控制器呈现它的视图时,通常会缩小该视图,使其框架不重叠设备的状态栏。将此属性设置为YES会导致视图控制器调整其视图大小,使其填满整个屏幕,包括状态栏下面的区域。 (当然,为了实现这一点,托管视图控制器的窗口本身必须被调整大小以填满整个屏幕,包括状态栏下面的区域)。通常,在有半透明状态栏并且希望您的视图内容可在该视图后面显示时,应将此属性设置为YES。
如果此属性为YES,则视图不会被调整大小以使其在选项卡栏下方,但会被调整大小以使其在半透明工具栏下方。无论此属性的值如何,导航控制器始终允许视图在半透明导航栏下方。
此属性的默认值为NO,这会导致视图的布局不会在状态栏下方。
请注意,-wantsFullScreenLayout属性只会影响窗口的根视图控制器。因此,如果这解决了您的问题(并且您没有在视图控制器层次结构中做任何奇怪的事情),请向Apple提交错误报告!

1
也许您的详细控制器中 [UIViewController statusBarHidden] 被设置为 NO

@MattyG 这是值得一试的。20像素总是看起来像状态栏的某些东西。 - Sulthan
是的,谢谢你的回复。我同意,这似乎与状态栏有关。这就是为什么我尝试删除模拟指标状态栏的原因。现在我不确定如何继续诊断问题了。 - MattyG
在VC上没有设置状态栏的属性 - 这是UIApplication的功能。很可能与状态栏有关。您是否在代码中对状态栏隐藏属性进行了任何基于代码的更改?如果您始终希望显示状态栏,则没有理由拥有它(因为这是默认值),并使用plist值使状态栏不会最初被隐藏。 - Rob Reuss
@RobReuss 哦,你说得对。我不知道我怎么会在文档中看到它的。我可能误点击了其他类别 :) 我希望xib中的模拟指标不会引起这个问题... - Sulthan

1
Xcode 4.5有一个应用自动布局的习惯,这可能是你烦恼的原因之一 - 检查并尝试取消选择它。

自动布局未被选中。无论如何,感谢建议。 - MattyG

1
你是否在XIB文件或编程中设置了高度的自动调整属性?如果是,请尝试将其删除,看看是否有助于解决问题。

0

可能有所帮助。 我也遇到了同样的问题,我只是在我的示例中减小了视图的大小: 我在 iPhone 应用程序的 XIB 中有 480 像素的高度,我将其减小到了 460 像素。 请尝试在 iPad 上进行相同的操作,不确定是否有帮助。


0
我在ViewWillAppear方法中尝试呈现另一个视图控制器时遇到了同样的问题。最终我通过将presentViewController代码移动到ViewDidAppear方法中解决了这个问题。希望能对你有所帮助。

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