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. MyCAT报java.lang.OutOfMemoryError: Java heap space

    早上同事反映,mycat又假死了,估计还是内存溢出,查看了一下错误日志. INFO | jvm | // :: | java.lang.OutOfMemoryError: Java heap spac ...

  2. ASP.NET Web API 创建帮助页

    1. 安装 Microsoft.AspNet.WebApi.HelpPage 程序包 Install-Package Microsoft.AspNet.WebApi.HelpPage 2. 注册 Ar ...

  3. Android百度地图 关于visibility="gone"的奇葩问题

    最近在项目中遇到一个奇葩问题,花了很长时间,在这里记录下. 问题描述:我的主界面是ViewPager+Fragment,并且设置缓存了我的4个ViewPager页面.左侧是一个侧滑菜单,点击相应按钮打 ...

  4. 相克军_Oracle体系_随堂笔记009-检查点队列

    1.检查点队列 checkpoint queue RBA 日志块地址 redo block address LRBA 第一次被脏的地址 HRBA 最近一次被脏的地址 on disk rba 重做日志( ...

  5. 【JUC】JUC线程池框架综述

    一.前言 在分析完了JUC的锁和集合框架后,下面进入JUC线程池框架的分析,下面给出JUC线程池的总体框架,之后再逐一进行分析. 二.JUC线程池框架图 说明:从上图可知,JUC线程池框架中的其他接口 ...

  6. Android 命名规范 (提高代码可以读性)

    android文件众多,根据名称来辨别用途很重要,因此命名要规范 这篇文章可参考:Android 命名规范 (提高代码可以读性) 刚接触android的时候,命名都是按照拼音来,所以有的时候想看懂命名 ...

  7. gitlab工作流程简介

    gitlab工作流程简介 新建项目流程 创建/导入项目 可以选择导入github.bitbucket项目,也可以新建空白项目,还可以从SVN导入项目 建议选择private等级 初始化项目 1.本地克 ...

  8. 【原创】kafka server源代码分析(二)

    十四.AbstractFetcherManager.scala 该scala定义了两个case类和一个抽象类.两个case类很简单: 1. BrokerAndFectherId:封装了一个broker ...

  9. Post方式打开新窗口

    最近在做一个跟ERP相连的领料网站,用到POST的方法打开新窗口来打印报表 代码转别人的,在这里记一下: javascript代码 function openPostWindow(url, data1 ...

  10. 火狐浏览器与Chorme的兼容性小问题

    1.如果 result 返回时空字符串, 则在 火狐里面 回调函数不会进入执行. 如果是 谷歌浏览器,则会 执行回调. $.post(, ipagesize: , strSearchKey: strk ...