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. MVC4做网站后台:模块管理1、修改模块信息

    网站可能会包含一些模块:像文章.产品.图片.留言等. 栏目模块主要实现功能,启用或禁用模块,模块权限设置,模块上传设置等. 权限设置和上传设置以后专门考虑,先来显示或禁用模块. 1.在顶部导航栏添加管 ...

  2. ASP.NET:在一般处理程序中通过 Session 保存验证码却无法显示图片?

    using System.Drawing; using System.Web; using System.Web.SessionState; /// <summary> /// Captc ...

  3. 拨乱反正:DDD 回归具体的业务场景,Domain Model 再再重新设计

    首先,把最真挚的情感送与梅西,加油! 写在前面 阅读目录: 重申业务场景 Domain Model 设计 后记 上一篇<设计窘境:来自 Repository 的一丝线索,Domain Model ...

  4. jdk8中java.util.concurrent包分析

    并发框架分类 1. Executor相关类 Interfaces. Executor is a simple standardized interface for defining custom th ...

  5. 浅谈 php 采用curl 函数库获取网页 cookie 和 带着cookie去访问 网页的方法!!!!

    由于近段时间帮朋友开发一个能够查询正方教务系统的微信公众平台号.有所收获.这里总结下个人经验. 开讲前,先吐槽一下新浪云服务器,一个程序里的   同一个函数  在PC测试可以正常运行,在它那里就会挂的 ...

  6. grape动态PHP结构(三)——API接口

    一.app视图与控制器

  7. PHP中json_encode后中文乱码的解决方案

    <?php header("Content-Type:text/html;charset=utf-8;"); $arr = array ('Version_code'=> ...

  8. jQuery-1.9.1源码分析系列(十) 事件系统——事件包装

    首先需要明白,浏览器的原生事件是只读的,限制了jQuery对他的操作.举个简单的例子就能明白为什么jQuery非要构造一个新的事件对象. 在委托处理中,a节点委托b节点在a被click的时候执行fn函 ...

  9. Hexo折腾记

    如果时间可以静止,我希望就停在此刻. 前言 博主之前也有折腾wordpress和jekyll可对于一个前端er来说,wordpress让人没法尽兴,因为不知道该如何添加自己的代码.而jekyll就太麻 ...

  10. 基于STM32Cube的DAC数模转化

    1. STM32Cube配置 1.1 DAC配置   1.2 TIM6 配置 1.3 利用Cube产生工程程序,MDK打开软件       在主循环上添加语句:      HAL_TIM_Base_S ...