UI

Autolayout高级

2018-03-22  本文已影响10人  action爱生活

[TOC]

intrinsicContentSize

Intrinsic Content Size:固有大小。意思就是说我知道自己的大小,如果你没有为我指定大小,我就按照这个大小来。

比如:大家都知道在使用 AutoLayout 的时候,UILabel 就不用指定尺寸大小,只需指定位置即可,就是因为,只要确定了文字内容,字体等信息,它自己就能计算出大小来。

UILabelUIImageViewUIButton 等组件及某些包含它们的系统组件都有 Intrinsic Content Size 属性。

Content Hugging 约束(不想变大约束)

如果组件的此属性优先级比另一个组件此属性优先级高的话,那么这个组件就保持不变,另一个可以在需要拉伸的时候拉伸。

Content Compression Resistance 约束(不想变小约束)

如果组件的此属性优先级比另一个组件此属性优先级高的话,那么这个组件就保持不变,另一个可以在需要压缩的时候压缩。

例如:

image.png

Top Layout Guide

topLayoutGuide属性表示不希望被透明的状态栏或导航栏遮挡的内容范围的最高位置。这个属性的值是它的length属性的值(topLayoutGuide.length)

这个值可能由当前的ViewController或这个ViewController所属的NavigationController或TabBarController决定,有如下情况:

  1. 一个独立的ViewController,不包含于任何其他的ViewController。如果状态栏可见,topLayoutGuide表示状态栏的底部,否则表示这个ViewController的上边缘。
  2. 包含于其他ViewController的ViewController不对这个属性起决定作用,而是由容器ViewController决定这个属性的含义:
  1. 如果导航栏(Navigation Bar)可见,topLayoutGuide表示导航栏的底部。
  2. 如果状态栏可见,topLayoutGuide表示状态栏的底部。
  3. 如果都不可见,表示ViewController的上边缘。

总之是屏幕上方任何遮挡内容的栏的最底部。

Safe Area

作用:取代topLayoutGuidebottomLayoutGuide*

safeArea是描述你的视图部分不被任何内容遮挡的方法。

image.png

改变布局的方法

一、 setNeedsLayoutlayoutIfNeeded

更新Autolayout后,如何要立即刷新布局,还要依次调用以下两个方法


// 立即刷新布局(自己和subview的)

self.view.setNeedsLayout()

self.view.layoutIfNeeded()

setNeedsLayout给当前 UIView 立一个 flag,以表示后续应该调用 layoutSubviews方法,以调整当前视图及其子视图的布局。

layoutIfNeeded如果有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

二、 layoutSubviews

触发时机——Frame改变就会触发,具体如下

  1. 初始化不会触发layoutSubviews,但是如果设置了不为CGRectZero的frame的时候就会触发

  2. addSubview会触发layoutSubviews

  3. 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化

  4. 滚动一个UIScrollView会触发layoutSubviews

  5. 旋转Screen会触发父UIView上的layoutSubviews事件

  6. 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

何时重写 layoutSubviews 方法

当我们在某个类的内部调整子视图位置时,需要调用;如果你想要在外部设置subviews的位置,就不要重写。

三、sizeToFit

调用sizeToFit的时候,系统会根据内容的帮我布局一个它认为最合适的大小。

我们一般在不方便手动布局的时候才调用sizeToFit方法。比如

  1. navigationBar中对navigationItem的设置,(添加两个视图以上的控件到Item)

  2. toolBar中的对UIBarButtonItem的设置(一般我们还要添加弹簧控件)

上述两种场合就可以用sizeToFit这个方法,来让系统给我们做自动布局。(注意:如果就添加一个控件的话,我们直接设置fram也是可以的)

  1. 在tabBar中我们不能手动的添加的子控件,因为tabBar是根据控制器系统默认自动添加的tabBarItem。(猜想系统可能也会自动调用了这个方法)

  2. UILabel中添加文字,然后让调整label的大小来适应文字,我们也调用sizeToFit的方法。

上一篇下一篇

猜你喜欢

热点阅读