文档章节

Autolayout的Top Layout guide问题

法斗斗
 法斗斗
发布于 2015/10/14 10:12
字数 1009
阅读 2854
收藏 1

iOS开发——Autolayout的Top Layout guide问题

写这篇博客之前,真想大吼一声:Top Layout Guide,你到底是什么鬼!

问题描述

在学习UIPageViewController的过程中,按照《【译】如何使用Storyboard创建UIPageViewController》编写引导页Demo,但是做完的效果和Demo效果有一些出入,效果分别为:正确效果错误效果

简单说就是当滑动到下一页的时候,下一页会有一个缩小效果,但是这个效果并不是手动添加的。

分析问题

之前的那篇《iOS学习笔记——UIScrollView的坑和填坑》中提到了Autolayout的问题:自动添加Constraints导致出错。这次要说的问题和上次都和一个东西有关——Top Layout Guide。

Top Layout Guide用于自动布局的辅助,在Storyboard中可以看到Top Layout Guide作为ViewController的属性存在,也就是topLayoutGuide,官方文档对这个属性的Discussion是:

topLayoutGuide属性表示不希望被透明的状态栏或导航栏遮挡的内容范围的最高位置。这个属性的值是它的length属性的值(topLayoutGuide.length),这个值可能由当前的ViewController或这个ViewController所属的NavigationController或TabBarController决定,有如下情况:

  • 一个独立的ViewController,不包含于任何其他的ViewController。如果状态栏可见,topLayoutGuide表示状态栏的底部,否则表示这个ViewController的上边缘。

  • 包含于其他ViewController的ViewController不对这个属性起决定作用,而是由容器ViewController决定这个属性的含义:

    • 如果导航栏(Navigation Bar)可见,topLayoutGuide表示导航栏的底部。

    • 如果状态栏可见,topLayoutGuide表示状态栏的底部。

    • 如果都不可见,表示ViewController的上边缘。

这部分还比较好理解,总之是屏幕上方任何遮挡内容的栏的最底部。

通过对ViewController的生命周期消息进行跟踪,在下一页显示出来前,首先调用下一页ViewController的viewDidLoad方法,也就是加载过程,此时topLayoutGuide值为0;而显示的消息viewWillAppear:和布局的消息viewWillLayoutSubview在放开手指之后才会发送,而这个时候已经完全显示了,topLayoutGuide的值为20,也就是在状态栏下边缘。

当松手的时候,topLayoutGuide的值发生的这一个变化,就导致我们看到了一个突然缩小的效果。

解决问题

到现在为止,找到了两个解决方法,不过并不完美。

方法一:在设置自动布局约束时,不使用Top Layout Guide,而是使用父View的上边缘。

说方法二之前,还要在说一下AutoLayout的设置,默认添加的约束是这样的:

屏幕快照 2014-10-22 下午3.48.30

注意第二项Top Layout Guide.Bottom,也就是约束到topLayoutGuide的下边缘,也就是说topLayoutGuide是有高度的!!

再次查文档中对length的解释:

The top layout guide indicates the distance, in points, between the top of a view controller’s view and the bottom of the bottommost bar that overlays the view.

可以看到是指当前ViewController的上边缘到遮挡内容的Bar的下边缘,那么topLayoutGuide的top和bottom也就是这两个边缘了。

方法二:自动布局的约束中,将Top Layout Guide.Bottom改为Top Layout Guide.Top。

这两个方法达到的效果是一样的,都是让Label以内容ViewController的上边缘进行约束,也就不会有变化了。Demo中没有这个问题,是因为Demo没有使用Autolayout。

但是也正是如此,两个方法都不完美。内容ViewController是动态加载并嵌入到UIPageViewController中的,而topLayoutGuide又是一个只读属性,不能嵌入到UIPageViewController之前进行设置。

完美的方法应该是在加载内容ViewController的同时,告知内容ViewController它将被嵌入到另一个容器当中,而这个容器包含一个Status Bar,所以应该重新判断topLayoutGuide的值,但遗憾的是目前还没有找到这种完美的解决方案。如果你知道,希望能告诉我,谢谢!


本文转载自:

法斗斗
粉丝 23
博文 368
码字总数 17774
作品 0
杨浦
程序员
私信 提问
深入理解 Autolayout 与列表性能 -- 背锅的 Cassowary 和偷懒的 CPU

深入理解 Autolayout 与列表性能 -- 背锅的 Cassowary 和偷懒的 CPU 这篇文章会通过对 autolayout 内部实现的探索和数据分析和对 autolayout 的性能问题做一个详细的分析,并在最后给出一个高...

nangezao
2018/10/29
0
0
Auto Layout + Manual Layout 混用

约束代码混用的问题 无数人趟过此坑,大部分人在坑中一蹶不振,小部分人爬起来也是跌跌撞撞。 有很多人都说auto layout和manual layout的坐标设置是不能混用的,会导致出现布局问题。首先声明...

人独立
2015/12/04
373
0
Autolayout优秀的第三方开源库

今天才发现CSDN支持markdown了…还是给出新博客地址:Autolayout优秀的第三方开源库 最近项目开始用纯代码布局整个UI框架, 对于前一段很长时间都是xib+storyboard狂拖控件约束的我来说,每天写...

humingtao2013
2015/06/25
0
0
电信网络拓扑图自动布局

在电信网络拓扑图中,很经常需要用到自动布局的功能,在大数据的层级关系中,通过手工一个一个摆放位置是不太现实的,工作量是相当大的,那么就有了自动布局这个概念,来解放布局的双手,让网...

xhload3d
2016/08/22
339
0
ios8 iOS Auto Layout

引言: Auto Layout是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应. 要完全掌握Auto Layout是一...

AK_47
2014/10/31
2.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
10
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
1K
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部