列举下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. odoo8登录时,同帐号在其它客户端的连接自动退出

    odoo跟大多数B/S系统一样,同一个帐号可以在不同的电脑上登录,并且可以同时操作,这样子会带来一些权限上的漏洞.为了解决这个问题,经过分析odoo的session处理机制,开发了一个模块,安装此模块 ...

  2. 用Java axis2调用.net平台的Webservice出现的一些问题

    问题1: AxisFault faultCode: {http://schemas.microsoft.com/ws/2005/05/addressing/none}ActionNotSupporte ...

  3. 【构建Android缓存模块】(一)吐槽与原理分析

    http://my.oschina.net/ryanhoo/blog/93285 摘要:在我翻译的Google官方系列教程中,Bitmap系列由浅入深地介绍了如何正确的解码Bitmap,异步线程操作以 ...

  4. JDBC数据库编程:PreparedStatement接口

    使用PreparedStatement进行数据库的更新及查询操作. PreparedStatement PreparedStatement是statement子接口.属于预处理. 使用statemen ...

  5. Springmvc UPDATE 数据时 ORA-01858:a non-numeric character was found where a numeric was expected

    ORA-01858:a non-numeric character was found where a numeric was expected 异常. 我的代码: 主要是绑定变量带出来的问题. 出错 ...

  6. vue cli3.0 build 打包 的 js 文件添加版本号 解决 js 缓存问题

    在 vue.config.js 的文件中加入下面这段话 // vue.config.jsconst Timestamp = new Date().getTime();module.exports = ...

  7. python selenium --一些常用方法

    · text  获取该元素的文本 · submit  提交表单 · get_attribute  获得属性值 text   用于获取元素的文本信息 下面把百度首页底部的声明打印输出 #coding=u ...

  8. JAVA 并发编程-应用篇

    提到java多线程不免有些人会头大.非常多概念都是非常理解可是真正到了实战的时候又是不知道怎样操作了.以下就结合实际项目来说说多线程的应用. 业务需求: 举例:批量插入10万条用户的相关活动优惠券 操 ...

  9. Laravel之路(事务)mysql事务

    其实关于mysql的事务(原声mysql语句),我在我的博客里面有提到(mysql的文章分类下) 今天看下基于laravel框架ORM的处理 准备: 表必须是InnoDB引擎 DB::beginTra ...

  10. 计算机系统监控 PerformanceCounter

    PerformanceCounter 컴퓨터 성능 머니터링 CUP Processor 메모리 하터웨어 DB (CPU,User Connection,Batch Request,Blocking ...