列举下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. git笔记之安装使用

    git是什么? 简介一下,Git是一个开源的分布式版本号控制系统,用以有效.快速的处理从非常小到非常大的项目版本号管理.Git是眼下世界上最先进的分布式版本号控制系统,没有传说中的之中的一个. Git ...

  2. Image Based Lighting In UE3

    "IBL"全称为"Image-based Lighint",是一种伪装全局光照的方法.使用该方法可以获得较好的视觉效果并且可以达到实时渲染的目的. 实现的方法之 ...

  3. 人工智能 VS 机器学习 VS 深度学习

    (原文:) The Difference Between AI, Machine Learning, and Deep Learning? (译文:) 人工智能 . 机器学习 和 深度学习的区别? 作 ...

  4. 安装inkscape for mac注意事项

    今天为了安装inkscape for mac,搞了一下午.按以前的方法,先安最新的XQuartz,再安最新的inkscape,在运行inkscape前先打开XQuartz.但是发现不行了,inksca ...

  5. 深入研究memcache 特性和限制

    深入研究memcache 特性和限制在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 .Memcached 单进程最大使用内存为2G,要使用更多内存,可以分多个端口开启多个M ...

  6. 深入理解C#学习笔记之走出误区

    通过学习深入理解C#这本书,发现自己对于C#这门语言一直存在着三个误区. 第一个误区:结构是轻量级的类: 我一直认为值类型不应该具有方法或其他有意义的行为,它们只应该具有一些简单的属性.但书中总结了一 ...

  7. Atitit.http连接合并组件   ConnReducerV3 新特性

    Atitit.http连接合并组件   ConnReducerV3 新特性 D:\0workspace\AtiPlatf_cms\src\com\attilax\util\ConnReducerV2. ...

  8. Xcode 警告信息处理:Format string is not a string literal (potentially insecure)

    转自:http://www.oschina.net/question/54100_33881 NSObject *obj = @"A string or other object." ...

  9. Java Annotations, Java Reflection, and Java Test Runner

    www.vogella.com/tutorials/JavaAnnotations/article.html

  10. poj 1113 Wall 凸包的应用

    题目链接:poj 1113   单调链凸包小结 题解:本题用到的依然是凸包来求,最短的周长,只是多加了一个圆的长度而已,套用模板,就能搞定: AC代码: #include<iostream> ...