全屏布局(fullScreenLayout)那些事

图片来源@百度图片

当我们使用UINavigationController时,插入一个控制器,然后往这个控制器的view上加subview(比如一个tableView)时,经常会碰到tableView的实际展示跟自己设置的frame不一致的情况。这里就总结记录一下平时自己遇到过的相关问题。

iOS7之前控制器有一个属性wantsFullScreenLayout。当把它设置为YES时,你添加的subview的y就是从屏幕的最顶部开始算,包含navigationbar,设置为NO时,则从navigationbar的bottom开始算。因为iOS7之前,navigationbar默认一般是不透明的,所以wantsFullScreenLayout一般默认为NO。从iOS7开始,这个属性被废弃了,代替它的是三个新的属性:edgesForExtendedLayoutextendedLayoutIncludesOpaqueBarsautomaticallyAdjustsScrollViewInsets,今天重点说的就是这三个经常用的属性。

edgesForExtendedLayout

The extended edges to use for the layout.
This property is applied only to view controllers that are embedded in a container such as UINavigationController. The window’s root view controller does not react to this property. The default value of this property is UIRectEdgeAll

这个属性是通过扩展子视图的边缘来适配屏幕,因为iOS7之后鼓励全屏,navigationbar变得半透明,所以这个属性默认为UIRectEdgeAll,及x和y是从屏幕的左上角开始算的。比如设置tableView的frame如下:

self.tableView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 350);

这里为了防止automaticallyAdjustsScrollViewInsets的干扰,我们在viewDidAppear:方法里加上一句代码,下文会细说。

// 相当于把automaticallyAdjustsScrollViewInsets设置为NO了
self.tableView.contentInset = UIEdgeInsetsZero;

效果如下图:

UIRectEdgeAll

当如下更改edgesForExtendedLayout的设置时

self.edgesForExtendedLayout = UIRectEdgeNone;

效果如下:

UIRectEdgeNone

显然这是我们要的tableView效果,但是我们发现navigationbar的颜色变灰了,这是因为navigationbar是半透明的,但是navigationbar下面没有视图。

这时我们可以通过改变navigationbar的透明度来实现。

self.navigationController.navigationBar.translucent = NO;   
//    self.edgesForExtendedLayout = UIRectEdgeNone;

设置不透明之后,subview的边缘就扩展不到顶部上了,只能到navigationbar的底部。效果

extendedLayoutIncludesOpaqueBars

A Boolean value indicating whether or not the extended layout includes opaque bars.
The default value of this property is NO

这个属性是指当navigationbar不透明时,layout是否包含navigationbar。当navigationbar透明时,此属性不起作用。比如在上面设置不透明的基础上,把这个属性设置为YES(该属性默认NO),

self.navigationController.navigationBar.translucent = NO;  
//    self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = YES;

发现tableView的y从屏幕最顶部开始算了。

extendedLayoutIncludesOpaqueBars

automaticallyAdjustsScrollViewInsets

A Boolean value that indicates whether the view controller should automatically adjust its scroll view insets.
The default value of this property is YES, which lets container view controllers know that they should adjust the scroll view insets of this view controller’s view to account for screen areas consumed by a status bar, search bar, navigation bar, toolbar, or tab bar. Set this property to NO if your view controller implementation manages its own scroll view inset adjustments.

这个属性太强大了,它会根据navigationbar和tabbar的存在,自动调整scrollView的contentInset。如下图

automaticallyAdjustsScrollViewInsets

透过半透明的navigationbar可以看到tableView的y其实还是在屏幕的最顶部,但是第一个cell已经变成从navigationbar的底部开始了,这是因为automaticallyAdjustsScrollViewInsets属性默认为YES,tableView的contentInset已经由UIEdgeInsetsZero自动调整为UIEdgeInsetsMake(64, 0, 0, 0)了。当我们设置self.automaticallyAdjustsScrollViewInsets = NO;时,就变成上文第一张效果图的效果了。但是它也有不足,就是scrollview必须是根视图添加的第一个子视图,否则此属性无效。

最后

这都是作者在实际工作中的一些总结,如有不对之处,欢迎指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • /* UIViewController is a generic controller base class th...
    DanDanC阅读 1,800评论 0 2
  • 1.badgeVaule气泡提示 2.git终端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夹内容...
    i得深刻方得S阅读 4,640评论 1 9
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,477评论 1 14
  • 嗨,你们好 嗨,好久不见 叮咚,门铃响了 一如既往的打开一扇门,二扇门 突然来了一句:“小王,今天让你做的,做完了...
    _似锦年华阅读 474评论 0 2
  • 无意遇到简书,看着下载评论里很多人因简书而兴奋和满足,被他们感染了,也下载了下来。对于我这种接受填鸭式教育且...
    f29e1084117a阅读 175评论 0 0