理解setNeedsLayout和layoutIfNeeded的区别

学习文档:https://www.jianshu.com/p/d46bcc656e04 https://www.jianshu.com/p/a84f85729952
概念理解

layoutSubviews:

Subclasses can override this method as needed to perform more precise layout of their subviews. You should override this method only if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want. You can use your implementation to set the frame rectangles of your subviews directly.

这是官方文档,大致意思就是,子类可以根据需要重写此方法,以对其子视图执行更精确的布局。仅当子视图的自动调整大小和基于约束的行为没有提供所需的行为时,才应复写此方法。您可以使用直接设置子视图的框架矩形。我个人理解的就是,平时没事儿不要乱复写,只有在父视图或子视图,bounds改变了,要做出相应的约束更新改变再复写。如果某个视图自身的bounds或者子视图的bounds发生改变,那么这个方法会在当前runloop结束的时候被调用。
为什么不是立即调用呢?因为渲染毕竟比较消耗性能,特别是视图层级复杂的时候。这种机制下任何UI控件布局上的变动不会立即生效,而是每次间隔一个周期,所有UI控件在布局上的变动统一生效并且在视图上更新,苹果通过这种高性能的机制保障了视图渲染的流畅性。

setNeedsLayout:标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,在下一轮runloop结束前刷新,对于这一轮runloop之内的所有布局和UI上的更新只会刷新一次,layoutSubviews一定会被调用。
layoutIfNeeded:如果有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

代码亲测

模拟一个博主的例子我自己试了一下,用mainbord,写一个Button,用来触发改变约束的动作,写一个一开始就给定约束testView

  [self.view layoutIfNeeded];//此方法强制立即布局并显示更新。你可能会想知道为什么在我们进行约束更改之前调用它呢,因为苹果认为这是一个最佳做法,以确保任何以前的更新等待更新周期的完成,所以我已经添加了它
    if ( self.testHeight.constant == 41.00 ) {
        self.testHeight.constant = 80;
    }else {
        self.testHeight.constant = 41;
    }
    
    [UIView animateWithDuration:2.0 animations:^{
        [self.view layoutIfNeeded];//你会发现,是有动画效果的改变约束 
//        [self.view setNeedsLayout];//如果注释掉上一行layoutIfNeeded代码 而把本行放出来,是我动画效果的立即改变约束 
    }completion:^(BOOL finished) {
    }]; 
这是为什么?

在动画里UIView animateWithDuration设置layoutIfNeeded就有动画的改变约束,设置setNeedsLayout没有动画的改变约束?
原因:layoutIfNeeded代表立即刷新,由于约束更改是同步进行的,所以我在约束改变前,和改变中,改变后都会在动画块中展示出来,因此在动画块中捕获来自约束更改的帧移动。而且我亲测,假如没有第一行layoutIfNeeded,现象还是如此,但是我们最好还是按照苹果的建议。
我们再来看一下动画块里注释掉layoutIfNeeded,而调用[self.view setNeedsLayout];
重点来了,那既然setNeedsLayout是下一次刷新才改变,那为什么我会看到约束瞬间改变呢?
这是因为,他本该在下一次runloop结束前刷新,可是我们没有在动画块的上下文进行视图更新,就认为这次周期已经结束了,而块里的代码,又是一个新的周期,因为我们标记为更新,更新周期的发生的地方也是动画开始的地方。没有动画是因为通过setNeedsLayout进行布局更新,所以是在更新周期中立即启动视图更新,而不是从更新周期开始约束更改和帧移动的动画

That‘s all. 以上也算是我中午的一个学习的整理,其实就是把其他优秀的程序员的内容,自己理解翻译了一下。不过不积跬步,何以至千里。当然 日积跬步,也何以至千里啊(捂脸🤦‍♂️)。我们还是要,高效快速学习 笔芯芯~~~~~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容