iOS layout的相关方法:
1,layoutSubviews
2,layoutIfNeeded
3,setNeedsLayout
4,setNeedsDisplay
5,drawRect
6,sizeThatFits
7,sizeToFit
 
大概有以上几个。
 
一,layoutSubviews
这个方法,默认没有做任何事情,需要子类进行重写。layoutSubviews会在以下情况下被调用:
1,init初始化不会触发layoutSubviews,如果设置了不为CGRectZero的frame的时候会被调用。
2,addSubview会触发layoutSubviews。
3,设置view的frame的时候会被调用,当然前提是frame的值设置前后发生了变化。
4,滚动一个UIScrollView会触发layoutSubviews事件。
5,旋转Screen会触发父UIView上layoutSubviews。
6,改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
7,直接调用setLayoutSubviews。
 

不建议直接调用layoutSubviews方法。
 
 
二,setNeedsLayout
标记为需要重新布局,不立即刷新,但是layoutSubviews在合适的时机一定会被调用。
 
三,layoutIfNeeded
如果有layoutIfNeeded标记的刷新,立即调用layoutSubviews进行重新布局。
 
对于一组动画而言,不管有多少约束改变,只需在动画里执行一次layoutIfNeeded,所有的都会以动画的方式。如果一些变化不想动画,在动画之前执行layoutIfNeeded。
 
四,drawRect
这个方法用来重绘。
 
drawRect在以下情况下会被调用:
1,如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect调用是在controller->loadView,controller->viewDidLoad两个方法之后调用的,所以不用担心在控制器中,这些view的drawRect就开始画了。这样可以在控制器中设置一些值给view(如果这些view在draw的时候需要用到某些变量值)。
2,该方法在sizeToFit后被调用,所以可以先调用sizeToFit计算出size,然后系统自动调用draRect方法。
3,通过设置contentMode属性值为UIViewConentModeReDraw。那么将在每次设置或者更改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
1,sizeToFit会自动调用sizeThatFits方法。
2,sizeToFit不应该在子类中被重写,应该重写sizeThatFits
3,sizeThatFits传入的参数是receiver当前的size,返回一个适合的size。
4,sizeToFit可以被手动调用直接调用,sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己。
 
 
补充:
1,layoutSubviews对subviews重新布局
2,layoutSubviews方法调用优先于drawRect
3,setNeedsLayout在receiver标记上一个需要重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews
4,layoutIfNeeded方法如其名,UIKit会判断该receiver是否需要layout。
5,layoutIfNeeded遍历的不是superviews链,而是subviews链。
6,drawRect是对receiver的重绘,能获得context
7,setNeedsDisplay在receiver 上标上一个需要被重新绘制的标记,在写一个draw周期自动绘制。iPhone device的刷新频率是60z,也就是1/60s后重新绘制。
8,UIView的setNeedsDisplay和setNeedsLayout方法区别:
     首先,这两个方法都是异步调用的。
     其次,
          setNeedsDisplay会自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。
          setNeedsLayout会默认调用layoutSubViews,这样就可以处理视图。
     综上所述,setNeedsDisplay方便绘图,setNeedsLayout方便出数据。 

UIView的几个layout方法的更多相关文章

  1. 谈谈UIView的几个layout方法

    谈谈UIView的几个layout方法-layoutSubviews.layoutIfNeeded.setNeedsLayout...   最近在学习swift做动画,用到constraint的动画, ...

  2. 谈谈UIView的几个layout方法-layoutSubviews、layoutIfNeeded、setNeedsLayout...

    最近在学习swift做动画,用到constraint的动画,用到layoutIfNeeded就去研究了下UIView的这几个布局的方法. 下面是做得一个动画,下载地址:https://github.c ...

  3. UIView的生命周期和layout方法总结

    生命周期 1. loadView 什么时候调用? 每次访问UIViewController的view时候并且view == nil时候调用. 如何实现? 1> 如果在初始化UIViewContr ...

  4. UIView剖析之Draw、Size、Layout方法

    一.基于UIView的Layer的方法 关于UIView的Layer,IOS提供了三个方法: 1.layoutSubviews 在iOS5.1和之前的版本,此方法的缺省实现不会做任何事情(实现为空), ...

  5. UIView的layoutSubviews和drawRect方法

    UIView的layoutSubviews和drawRect方法   首先两个方法都是异步执行.layoutSubviews方便数据计算,drawRect方便视图重绘.   layoutSubview ...

  6. Android的onLayout、layout方法讲解

    onLayout方法是ViewGroup中子View的布局方法,用于放置子View的位置.放置子View很简单,只需在重写onLayout方法,然后获取子View的实例,调用子View的layout方 ...

  7. iOS之layout方法-layoutSubviews、layoutIfNeeded、setNeedsLayout

    下面列举下iOS layout的相关方法: layoutSubviews layoutIfNeeded setNeedsLayout setNeedsDisplay drawRect sizeThat ...

  8. UIView的layoutSubviews和drawRect方法何时调用

    首先两个方法都是异步执行.layoutSubviews方便数据计算,drawRect方便视图重绘. layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubvi ...

  9. UIView的layoutSubviews和drawRect方法何时调用 ———转

    转自:http://jianyu996.blog.163.com/blog/static/112114555201305113018814/ 首先两个方法都是异步执行.layoutSubviews方便 ...

随机推荐

  1. Description Resource Path Location Type Error executing aapt: Return code -1073741819 Client line 1

    Logcat报错:Description    Resource    Path    Location Type Error executing aapt: Return code -1073741 ...

  2. 窥探Swift系列博客说明及其Swift版本间更新

    Swift到目前为止仍在更新,每次更新都会推陈出新,一些Swift旧版本中的东西在新Swift中并不适用,而且新版本的Swift会添加新的功能.到目前为止,Swift为2.1版本.去年翻译的Swift ...

  3. Javascript常用正则表达式汇总

    一.匹配数字和字符串 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$ 只能输入数字:"^[0-9]*$". 只能输入n位的数 字:"^\d{n}$&qu ...

  4. 基于 Hive 的文件格式:RCFile 简介及其应用

    转载自:https://my.oschina.net/leejun2005/blog/280896 Hadoop 作为MR 的开源实现,一直以动态运行解析文件格式并获得比MPP数据库快上几倍的装载速度 ...

  5. Android之自定义ViewPager实现图片的无线轮播

    PS:以前也写过关于图片轮播这一块的博客.不过写的很烂,并且很多情况没有考虑到(没有支持无线轮播,和手势点击事件).因此这里写一篇补上.也是当时太年轻了. 注:图片请放大后再看.否则看不清楚. 学习内 ...

  6. OpenGL超级宝典visual studio 2013开发环境配置,GLTools

    做三维重建需要用到OpenGL,开始看<OpenGL超级宝典>,新手第一步配置环境就折腾了一天,记录下环境的配置过程. <超级宝典>中的例子使用了GLEW,freeglut以及 ...

  7. CQRS, Task Based UIs, Event Sourcing agh!

    原文地址:CQRS, Task Based UIs, Event Sourcing agh! Many people have been getting confused over what CQRS ...

  8. 不使用jQuery对Web API接口POST,PUT,DELETE数据

    前些天,Insus.NET有演示Web API接口的操作: <怎样操作WebAPI接口(显示数据)>http://www.cnblogs.com/insus/p/5670401.html ...

  9. ASP.NET Core开发-如何配置Kestrel 网址Urls

    ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Urls,使用多种方式配置Urls. ...

  10. caching与缓存

    通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能.例如,如果应用程序使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,避免在用 ...