列举下iOS layout的相关方法:

layoutSubviews

layoutIfNeeded

setNeedsLayout

setNeedsDisplay

drawRect

sizeThatFits

sizeToFit

大概经常使用的上面几个 , 详细的应该还有别的。

layoutSubviews

这种方法,默认没有做不论什么事情,须要子类进行重写 。 系统在非常多时候会去调用这种方法:

1.初始化不会触发layoutSubviews,可是假设设置了不为CGRectZero的frame的时候就会触发。

2.addSubview会触发layoutSubviews

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

4.滚动一个UIScrollView会触发layoutSubviews

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

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

在苹果的官方文档中强调: You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.layoutSubviews, 当我们在某个类的内部调整子视图位置时,须要调用。反过来的意思就是说:假设你想要在外部设置subviews的位置。就不要重写。

setNeedsLayout

标记为须要又一次布局。不马上刷新,但layoutSubviews一定会被调用

配合layoutIfNeeded马上更新

layoutIfNeeded

假设,有须要刷新的标记,马上调用layoutSubviews进行布局

这个动画中实用到 举个栗子 。

如图 , 上面有个label ,中间有个button 。 label已经被自己主动布局到左上角 。

然后我们那个left的constraint

@IBOutlet weak var leftContrain:NSLayoutConstraint!

在viewDidLoad中声明好。然后在Main.storyboard中进行连线。点击button的时候 ,我们把左边的距离改成100 。

在button的点击事件里加上这句。

leftContrain.constant = 100

然后我们想要一个动画的效果。

假设这么做

UIView.animateWithDuration(0.8, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: UIViewAnimationOptions.AllowAnimatedContent, animations: {

self.leftContrain.constant = 100

}, completion: nil)

你会发现然并卵 。事实上这句话self.leftContrain.constant = 100仅仅是运行了setNeedsLayout 标记了须要又一次布局。可是没有马上运行。所以我们须要在动画中调用这种方法layoutIfNeeded

所以代码应该这么写

leftContrain.constant = 100

UIView.animateWithDuration(0.8, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: UIViewAnimationOptions.AllowAnimatedContent, animations: {

self.view.layoutIfNeeded() //马上实现布局

}, completion: nil)

所以上面无论写多少约束的改变。仅仅须要在动画里动用 一次self.view.layoutIfNeeded() ,全部的都会已动画的方式 。假设一些变化不想动画 。在动画前运行self.view.layoutIfNeeded()

drawRect

这种方法是用来重绘的。

drawRect在下面情况下会被调用:

1、假设在UIView初始化时没有设置rect大小,将直接导致drawRect不被自己主动调用。

drawRect调用是在Controller->loadView, Controller->viewDidLoad 双方法之后掉用的.所以不用操心在控制器中,这些View的drawRect就開始画了.这样能够在控制器中设置一些值给View(假设这些View draw的时候须要用到某些变量值).

2、该方法在调用sizeToFit后被调用。所以能够先调用sizeToFit计算出size。然后系统自己主动调用drawRect:方法。3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自己主动调用drawRect:。4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,可是有个前提条件是rect不能为0。以上1,2推荐。而3,4不提倡

drawRect方法使用注意点:

1、若使用UIView画图。仅仅能在drawRect:方法中获取对应的contextRef并画图。

假设在其它方法中获取将获取到一个invalidate的ref而且不能用于画图。drawRect:方法不能手动显示调用。必须通过调用setNeedsDisplay 或者 setNeedsDisplayInRect,让系统自己主动调该方法。

2、若使用calayer画图,仅仅能在drawInContext: 中(相似于drawRect)绘制。或者在delegate中的对应方法绘制。相同也是调用setNeedDisplay等间接调用以上方法3、若要实时画图,不能使用gestureRecognizer,仅仅能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕

sizeToFit

sizeToFit会自己主动调用sizeThatFits方法;

sizeToFit不应该在子类中被重写,应该重写sizeThatFits

sizeThatFits传入的參数是receiver当前的size,返回一个适合的size

sizeToFit能够被手动直接调用sizeToFit和sizeThatFits方法都没有递归。对subviews也不负责。仅仅负责自己

文/大石头布(简书作者)

原文链接:http://www.jianshu.com/p/eb2c4bb4e3f1

iOS-setNeedsLayout等布局方法的更多相关文章

  1. iOS-提高iOS开发效率的方法和工具

    提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...

  2. flex 布局 初次接触这个好使又不是特别好用的布局方法

    刚开始学前端的童鞋们应该也是一样先学习的table然后再学习了盒子模型,感觉终于学会了简单的网页布局,使用各种display,float,position绞尽脑汁给页面布局成自己想要的页面样式,然而, ...

  3. iOS中的过期方法和新的替代方法

    关于iOS中的过期方法和新的替代方法 1.获取某些类的UINavigationBar的统一外观并设置UINavigationbar的背景 注:方法名改了但是基本使用方法不变 + (instancety ...

  4. opencv直线检测在c#、Android和ios下的实现方法

    opencv直线检测在c#.Android和ios下的实现方法 本文为作者原创,未经允许,不得转载 :原文由作者发表在博客园:http://www.cnblogs.com/panxiaochun/p/ ...

  5. iOS开发——实用篇&提高iOS开发效率的方法和工具

    提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...

  6. iOS与HTML5交互方法总结(转)

    今天小编在找技术文章的时候,发现这样一个标题:iOS与HTML5交互方法总结,怎么看着这么熟悉呢?   还以为是刚哥用了别的文章,点进去一看,原来是刚哥自己写的文章,他们转载的,而且还上了Dev St ...

  7. iOS UISearchController 的使用方法

    iOS UISearchController 的使用方法 UISearchController 让用户在 UISearchBar 上输入搜索关键词,展示搜索结果或者进行其他操作.UISearchCon ...

  8. IOS常见的加密方法,常用的MD5和Base64

    iOS代码加密常用加密方式 iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密.AES加密.BASE64加密,三大算法iOS代码加密是如何进行加密的,且看下文 MD5 iO ...

  9. QMdiArea及QMdiSubWindow实现父子窗口及布局方法

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QMdiArea及QMdiSubWindow实现父子窗口及布局方法     本文地址:http ...

  10. iOS与HTML5交互方法总结(修正)

    摘要 看了不少别人写的博客或者论坛,关于iOS与HTML5交互方法大概主要有5种方式: 1. 利用WKWebView进行交互(系统API) 2. 利用UIWebView进行交互(系统API) 3. 苹 ...

随机推荐

  1. 1、jQuery概述

    JQuery基本功能  ① 访问和操作Dom元素  ② 控制页面样式  ③ 对页面事件的处理  ④ 大量插件在页面中的运用  ⑤ 与Ajax技术的完美结合      $(document).ready ...

  2. Choose which tree,form view in many2one

    <field name="partner_id" context="{'ref_form_view': 'view_id_of_my_form','ref_tree ...

  3. C#音视频网络流解码:H264视频和ACC音频

    下面两种方式是直接翻译过来的,还有问题,比如指针的使用和值的传入.考虑C#和C++的差异,还是要抱着怀疑的态度去看待,不一定是对的. H264视频解码网络流: using FFmpeg.AutoGen ...

  4. java基础讲解13-----集合

    一:集合介绍 import java.util.ArrayList;import java.util.Collection;import java.util.Iterator; public clas ...

  5. FIle类常用工具方法整理(持续更新)

    1.递归遍历一个目录,获取所有文件名(也可以取到绝对路径) public static void traverse(String filePath, List<String> files) ...

  6. EularProject 32: 数字1-9排列构成乘法等式

    Pandigital products Problem 32 We shall say that an n-digit number is pandigital if it makes use of ...

  7. 用jquery制作一个简单的导航栏

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. atitit.提升性能AppCache

    atitit.提升性能AppCache 1.1. 起源1 2. 离线存储2 3. AppCache2 3.1. Appcache事件点如图2 3.2. Manifest文件4 3.3. 自动化工具4 ...

  9. atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97

    atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97 1. 实现html5化界面的要解决的策略1 1.1. Js交互1 1.2. 动态参 ...

  10. [k8s]k8s api-server启动systemd参数分析

    默认2个参数就可以启动(必需) kube-apiserver \ --service-cluster-ip-range=10.254.0.0/16 \ --etcd-servers=http://19 ...