topLayoutGuide和bottomLayoutGuide是UIViewController的属性示例

15

我希望有人能够演示如何使用在iOS 7中引入的UITableViewController的topLayoutGuide和bottomLayoutGuide属性。谢谢。

1个回答

16

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。我应该在哪里实现这个消息? - AveLeon
20
topLayoutGuide是一个动态生成的值。只有在视图控制器的视图已添加到视图层次结构后,使用它才有意义。如果在viewDidLoad中使用它,你将在视图添加到视图层次结构之前读取topLayoutGuide,因此会返回0。如果你在UIViewController的子类中使用topLayoutGuide,则可以在viewDidLayoutSubviews中最早可靠地使用它。如果你在UIView的子类中使用它,则可以使用layoutSubviews。你可以在这里详细了解它:http://goo.gl/Tn6moX - Stephen Melvin
2
我还想指出,如文档所述,topLayoutGuide在某些情况下会返回0。因此,重要的是不要过早读取其值。 - Stephen Melvin

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