10

在我的某些应用程序设计中或仅针对某些 UIViews,在 navigationController 的 pushViewController 之后,我的新视图将移出窗口状态栏的高度。因此,我将把这段代码存根放在 viewDidLoad 方法中。

CGRect  frameAt = [self.view frame];
CGRect  statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
frameAt.origin.y += statusBarFrame.size.height;
[self.view setFrame: frameAt];

这对我来说没有意义,这是 XCode 和 Interface Builder 的意图,所以我怀疑在我的视图设计期间我对 SDK 做了一些根本性的错误。此外,在我不必改变观点的罕见情况下,我真的不知道这两种设计方法有什么区别。

另请注意,大多数时候我尝试使用 IB 设计我的视图,并进行一些小的定制。

有没有其他人遇到过这种情况并且知道如果没有这样的代码存根他们会做什么来修复?

4

5 回答 5

16

我使用Apple 的 NavBar 示例代码来尝试重现此问题。

applicationDidFinishLaunching 最初是这样实现的:

[window addSubview:navigationController.view];
[window makeKeyAndVisible];

如果我将其更改为:

UIViewController *shellController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[shellController.view addSubview:navigationController.view];
[window addSubview:shellController.view];
[window makeKeyAndVisible];

然后我发现差距出现了。

但是,如果我只这样做:

UIView *shell = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[shell addSubview:navigationController.view];
[window addSubview:shell];
[window makeKeyAndVisible];

然后一切看起来都很正常。

所以我猜如果它是根视图控制器,每个视图控制器都会偏移它的视图。但是导航控制器会覆盖此行为以偏移其视图,无论它是否是根视图控制器。因此,我会说您的差距正在出现,因为您的导航控制器在层次结构中的位置比预期的要低。

于 2010-03-05T06:01:52.180 回答
2

这里要记住的主要事情是视图控制器将设置其视图本身的框架。这是因为视图可用的空间量可能会在应用程序的生命周期内发生变化,并且只有视图控制器知道如何适当地调整视图的框架。空间量变化的示例包括导航栏改变高度、将设备从纵向变为横向以及状态栏在用户接听电话时也会增加高度。因此,您不应自己修改视图的框架。

因此,您需要做的第一件事是删除所有与修改视图框架相关的代码。

现在您需要以框架大小随时可能改变的心态来设计您的视图。这意味着正确设置每个子视图的自动调整大小属性。如果这样做,那么是否打开模拟导航和状态栏都没有关系;他们只是在那里帮助您了解大多数情况下的最终结果。

您可以在尺寸检查器(带有标尺图标的那个)中设置界面生成器中每个子视图的自动调整大小属性。在动画中,白框代表视图控制器的根视图,红框代表当前选中的子视图。您会注意到子视图默认锚定在根视图的左上角。如果视图的大小从不改变,这很好,但我们知道这不是真的。如果您有想要出现在底部的子视图,那么您需要使用左侧的图表。它的工作方式是,如果选择了围绕边缘的四条线之一,则根视图的该边缘与子视图的边缘之间的距离是固定的。所以如果你想让一个子视图出现在底部,您需要确保选择最底部的行而不是顶部。中间的两行影响根视图改变大小时子视图的大小是否改变。因此,例如,如果您有一个想要占据整个屏幕高度的表格视图,您将确保选择了内部垂直线。这称为支柱和弹簧模型。

如果您以编程方式添加子视图,则需要在每个子视图上设置 autoresizingMask 属性。这里有一个解释

希望有帮助!

于 2010-03-04T08:35:02.807 回答
1

我遇到过类似的问题。看看我之前的两个问题:

iPhone - 关闭模态视图控制器后 - 页面顶部留有间隙

iPhone - UIView addSubview Gap 在顶部

于 2010-03-05T01:55:45.090 回答
0

链接文本

这里讨论了一个类似的错误。

动画也设置为否?尝试将其设置为 YES,因为这解决了我面临的类似问题。

于 2010-06-29T07:14:54.227 回答
0

Moshy 的回答非常有帮助,因为我终于意识到 IB 中的虚线/实线用于控制 UIView 元素的调整大小属性的含义。

但是,调整这些属性并没有解决我在我的一个观点中遇到的类似问题。此视图在 IB 中定义了状态和顶部栏。它有点重,包含一个可以在其中加载 HTML 字符串的 UIWebViewviewWillAppear和一些其他界面元素。

在加载视图时,如果用户突然将设备的方向从纵向更改为横向,则视图的所有内容都会向下移动状态栏的高度。即使在切换回纵向方向后,视图控件与其顶部之间产生的间隙仍然存在。

最终解决了我的问题和我剩下的头发的是添加以下行:

    self.view.frame = [[UIScreen mainScreen] bounds];

之内

-(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

自从我的视图内容保持原位,尽管设备方向突然发生变化。

于 2012-02-01T17:49:29.357 回答