topLayoutGuide 和 bottomLayoutGuide UIViewController 属性示例

Posted

技术标签:

【中文标题】topLayoutGuide 和 bottomLayoutGuide UIViewController 属性示例【英文标题】:Example of topLayoutGuide and bottomLayoutGuide UIViewController properties 【发布时间】:2013-07-30 23:32:23 【问题描述】:

如果有人能说明如何使用 ios 7 中引入的 UITableViewController 的 topLayoutGuide 和 bottomLayoutGuide 属性,我将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

topLayoutGuidebottomLayoutGuide 属性继承自 UIViewController 并实现 UILayoutSupport 协议。它们被设计为与AutoLayout 一起使用,但也可以不使用AutoLayout 直接使用。

topLayoutGuide 的情况下,该属性指示您不希望出现在半透明或透明 UIKit 栏(例如状态栏或导航栏)后面的内容的最高垂直范围。因此,如果您的视图控制器已被推入UINavigationController 堆栈,topLayoutGuide 将告诉您从屏幕顶部到状态栏和导航栏覆盖的点数。您可以使用此值将 UIScrollView 中的内容滚动到导航栏正下方,或确保您视图中的其他内容不被 UINavigationBar 覆盖。

请记住,topLayoutGuide 的值取决于视图控制器以及它是否包含在另一个视图控制器中。来自 Apple 的 UIViewController 文档:

限制此属性值的对象取决于 视图控制器是否是容器视图的子视图 控制器(例如导航或标签栏控制器),如下所示:

• 不在容器视图控制器内的视图控制器约束 此属性指示状态栏的底部(如果可见),或 否则指示视图控制器视图的顶部边缘。

• 容器视图控制器中的视图控制器不设置此 财产的价值。相反,容器视图控制器约束 要指示的值:

导航栏的底部,如果 导航栏可见

状态栏的底部,如果只有一个 状态栏可见

视图控制器视图的顶部边缘,如果 状态栏和导航栏都不可见

这是我用来移动UITextField 以响应键盘显示的一段代码。我将文本字段移动到导航栏的正下方。

CGFloat length = self.topLayoutGuide.length;
_feedback.frame = CGRectMake(_feedback.frame.origin.x, length + 5.0, _feedback.frame.size.width, _feedback.frame.size.height);

使用bottomLayoutGuide 与使用topLayoutGuide 完全相同,只是bottomLayoutGuide 指的是内容的最低垂直范围。

【讨论】:

我在 UIViewController 的 viewDidLoad 中设置 AutoLayout。当我运行 CGFloat length = self.topLayoutGuide.length;我得到的值为 0。我在哪里实现此消息? topLayoutGuide 是一个动态生成的值。只有在视图控制器的视图被添加到视图层次结构后才有意义。使用 viewDidLoad 将导致您在视图添加到视图层次结构之前读取 topLayoutGuide,因此返回 0。如果您在 UIViewController 的子类中使用 topLayoutGuide,最早可以可靠使用它的地方是 viewDidLayoutSubviews。如果你在 UIView 的子类中使用它,你可以使用 layoutSubviews。你可以在这里阅读所有相关信息:goo.gl/Tn6moX 我还想指出,topLayoutGuide 在某些情况下会返回 0,如文档中所述。所以重要的是不要过早地阅读它的价值。

以上是关于topLayoutGuide 和 bottomLayoutGuide UIViewController 属性示例的主要内容,如果未能解决你的问题,请参考以下文章

将子 UIView 锁定到 topLayoutGuide

调用 topLayoutGuide 会完全中断滚动吗?

UITableViewCell 重用后 topLayoutGuide 搞砸了

以编程方式向 topLayoutGuide 添加约束?

如何将约束添加到根视图而不是 TopLayoutGuide?

UITableView top to topLayoutGuide 以编程方式插入内容