在我的一些应用程序设计中或者只是一些 UIViews 中,在导航控制器的 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 来设计我的视图,并进行一些小的自定义。

还有其他人遇到过这个问题并且知道在没有这样的代码存根的情况下他们要做什么吗?

有帮助吗?

解决方案

我用苹果的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];

然后一切看起来正常。

因此,我想,如果它的根视图控制器每个视图控制器将偏移其视图。但导航控制器覆盖此行为,以抵消其观点,不管它是根视图控制器。因此,我想说你的差距在层次结构中出现,因为你已经有了一个导航控制器某处低于它应该是。

其他提示

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

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

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

您可以在 Interface Builder 的 Size Inspector(带有标尺图标的那个)中设置每个子视图的自动调整大小属性。动画中,白色框代表视图控制器的根视图,红色框代表当前选中的子视图。您会注意到,默认情况下子视图锚定到根视图的左上角。如果视图的大小永远不会改变,那很好,但我们知道事实并非如此。如果您无论如何都希望子视图出现在底部,那么您需要使用左侧的图表。它的工作方式是,如果选择边缘周围的四条线之一,则根视图的该边缘与子视图的边缘之间的距离是固定的。因此,如果您希望子视图出现在底部,则需要确保选择最底部的行而不是顶部的行。中间的两行影响当根视图改变大小时子视图的大小是否改变。因此,例如,如果您有一个表格视图想要占据屏幕的整个高度,则需要确保选择内部垂直线。这称为支柱和弹簧模型。

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

希望有帮助!

链接文本

一个类似错误是在这里讨论。

也就是动画集到NO?尝试将其设置为YES,因为这解决了我正面临着类似的问题。

Moshy的回答是非常有益的,因为我终于实现在IB中的虚线/实线的意义,用于控制的UIView元素的缩放特性。

然而,调节这些特性没有解决面对的我的视图中的一个类似的问题,我。这一观点曾在IB定义的状态和顶部栏。这是一个略显沉重之一, 含有一个UIWebView将viewWillAppear和其他一些接口元件内加载HTML字符串。

虽然加载视图,如果用户突然从纵向到横向改变了装置的取向,该视图的所有内容将向下通过状态栏的高度偏移。视图控件和它的顶部之间产生的间隙即使在切换回纵向取向后仍然存在。

什么终于解决了我的问题,我的剩余的头发,被添加一行:

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

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

自从我浏览内容在适当的位置,尽管突然设备取向的变化保持。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top