导航栏可能导致 UIView 偏移
Posted
技术标签:
【中文标题】导航栏可能导致 UIView 偏移【英文标题】:navigation bar possibly causing UIView offset 【发布时间】:2014-12-09 01:19:39 【问题描述】:我有一个由两个UIViews
组成的视图控制器。一个视图是超级视图,另一个是子视图。两个视图的大小相同 320X568 并且具有相同的原点 (0,0)。我通过首先将纵横比设置为自身,然后将宽度比设置为与父视图相等的宽度比(乘数为 1)来向子视图添加约束。然后我将子视图水平和垂直居中于容器中。当识别到向上拖动手势时,假设子视图使用CGRectOffset
向上移动一定量。我注意到视图没有在正确的位置结束,所以我删除了所有偏移代码以查看发生了什么。在viewDidLoad
中,我检查了超级视图和子视图的 origin.y 及其 0 - 这是正确的。但是,一旦识别出向上拖动手势,我就为 y 原点执行另一个 NSLog
,子视图打印 -31.5,超级视图打印 64。不确定所有 CGRectOffset
注释掉的情况如何。我认为这可能与导航栏有关,但我不确定。
【问题讨论】:
【参考方案1】:我不知道 CGRectOffset 有什么问题,但我知道没有它的“问题”是什么。这里没有问题!这里唯一的事情是您正在检查视图的origin.y
太快,即viewDidLoad
。
请记住,在viewDidLoad
中实际上还没有发生任何事情。视图控制器有一个视图,仅此而已。特别是,视图还没有在界面中并且还没有被赋予它的布局。
因此,这实际上只是了解这些事件的含义的问题。您假设 viewDidLoad
表示视图位于界面中并且具有其位置和大小。它没有那样的意思。如果你想知道布局后视图的位置是什么,你需要等到布局后。就像,viewDidLayoutSubviews
是个好地方。这意味着布局刚刚发生!
至于 64 值,这正是您所期望的。您已将视图的顶部固定到顶部布局指南 - 这意味着导航栏的底部,正如您所建议的那样。
【讨论】:
有道理。我明白为什么superview的origin.y是64,但是为什么subview的origin是-32。 我不能神奇地看到你的故事板,所以不知道它的约束是如何布局的。但这就是结果;之所以这样,是因为你就是这样设置的,我只能告诉你。 所以在viewDidLoad
之后,superview 的原点是 64,高度为 504 - 是有道理的。对于子视图,我将其垂直空间设置为顶部布局指南,常数为 -64。现在它的位置和高度是 -64 和 568。我有点困惑 origin.y 应该在哪里与导航栏存在。
好吧,考虑一下。 -64 相对于顶部布局指南意味着 64高于 高于顶部布局指南。顶部布局指南是导航栏的底部。因此,您将子视图的顶部定位在导航栏后面。同时,superview 的顶部是 at 顶部布局指南。子视图的位置 (frame
) 是在父视图坐标中测量的,因此它的 origin.y 为 -64 - 它比其父视图的顶部高 64 点。你得到的就是你要求的。
因此,由于父视图的 origin.y 为 64,因此子视图实际上 y=0。因此,由于我的子视图 origin.y =-64,那实际上是 superview.origin.y - 64 = 0,这是窗口的 origin.y。对吗?以上是关于导航栏可能导致 UIView 偏移的主要内容,如果未能解决你的问题,请参考以下文章