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. AngularJS之初级Route【一】(六)

    前言 这一节我们来讲讲AngularJS中的路由以及利用AngularJS在WebAPi中进行CRUD.下面我们一起来看看. 话题 当我们需要进行路由映射时即用到$route服务,在AngularJS ...

  2. Android sendevent/getevent 用法

    前言:最近在弄一个模拟用户点击屏幕的功能,并且不需要用户点击屏幕,后台自动给输入框赋值,类似pc端按键精灵的功能,在网上找了很多人的资料,写的都不是太详细,一知半解.还要自己慢慢研究.于是我这边写一篇 ...

  3. YII 的源码分析(二)

    上一篇简单分析了一下yii的流程,从创建一个应用,到屏幕上输出结果.这一次我来一个稍复杂一点的,重点在输出上,不再是简单的一行"hello world",而是要经过view(视图) ...

  4. 如何远程备份MySQL binlog

    以前备份binlog时,都是先在本地进行备份压缩,然后发送到远程服务器中.但是这其中还是有一定风险的,因为日志的备份都是周期性的,如果在某个周期中,服务器宕机了,硬盘损坏了,就可能导致这段时间的bin ...

  5. beego上传文件

    html代码: <form id="fform" method="POST" enctype="multipart/form-data" ...

  6. 从零开始构建 Wijmo & Angular 2 小应用

    中秋之际,Angular 团队发布 Angular 2 正式版,一款不错的图表控件Wijmo当天宣布支持 . Angular 2移除和替代了 Angular 1.X 中的 directives, co ...

  7. iOS - 类扩展与分类的区别

    类扩展 (Class Extension也有人称为匿名分类) 作用: 能为某个类附加额外的属性,成员变量,方法声明 一般的类扩展写到.m文件中 一般的私有属性写到类扩展 使用格式: @interfac ...

  8. 让自己也能使用Canvas

    <canvas> 是 HTML5 新增的元素,可使用JavaScript脚本来绘制图形.例如:画图,合成照片,创建动画甚至实时视频处理与渲染. 兼容性方面,除了一些骨灰级浏览器IE6.IE ...

  9. 5分钟学会使用Less预编译器

    5分钟学会使用Less预编译器 Less是什么? LESS CSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法为CSS赋予了动态语言的特性,如变量.继承.运算.函数等,更方便 ...

  10. Cesium应用篇:3控件(5)CesiumInspector

    CesiumInspector控件并不是带来太多功能上的,但对开发人员来说,对于了解Cesium的渲染效果以及性能调优,还是一个很有价值的控件,特别是一些渲染状态下的问题,采用该控件,应该还是会有很多 ...