layoutSubviews、setNeedsLayout 和 layoutIfNeeded

layoutSubviews 方法

布局子视图。

- (void)layoutSubviews;

此方法的默认实现在 iOS 5.1 及更早的版本中什么都不会做。否则,默认实现使用你已设置的任何约束来决定任何子视图的大小和位置。

子类可以根据需要覆盖此方法,以执行更精确的子视图布局。只有当子视图的自动缩放(autoresizing)和基于约束的行为(constraint-based behaviors)不能满足你想要的布局行为时,你才应该覆盖此方法。你可以覆写(重载)该方法,并在该方法中直接布局子视图。

你不应该直接调用这个方法。如果你想在下一次系统绘图更新之前强制布局更新,调用 setNeedsLayout 方法来完成。如果你想立即更新视图的布局,请调用 layoutIfNeeded 方法。

——摘自 Apple Documentation > ... > UIView > layoutSubviews

setNeedsLayout 方法

使当前布局失效,并在下一个更新周期内触发布局更新

- (void)setNeedsLayout;

当你想要调整视图中子视图的布局时,在你的应用程序的主线程中调用这个方法。这个方法会记下请求并立即返回。因为这个方法不会强制立即更新,而是等待下一个更新周期,所以你可以在任何一个视图被更新之前,用它来失效多个视图的布局。这种行为允许你将所有的布局更新合并到一个更新周期,这通常对性能更好。

——摘自 Apple Documentation > ... > UIView > setNeedsLayout

layoutIfNeeded 方法

如果当前布局正在等待更新,调用此方法会立即更新子视图布局

- (void)layoutIfNeeded;

使用此方法可强制视图立即更新其布局。使用自动布局(Auto Layout)时,布局引擎会根据需要更新视图的位置,以满足约束的变化。将接收到消息的视图作为根视图,此方法将从根视图开始布局视图子树。如果当前没有布局在等待更新,则该方法退出,也不会修改布局或调用任何布局相关的回调。

—— 摘自 Apple Documentation > ... > UIView > layoutIfNeeded

requiresConstraintBasedLayout 方法

返回一个布尔值,表示接收者是否依赖于基于约束的布局系统。

@property(class, nonatomic, readonly) BOOL requiresConstraintBasedLayout API_AVAILABLE(ios(6.0));

如果视图在窗口中必须使用基于约束的布局才能正常运行时,返回 YES,否则返回 NO

当有人试图使用基于约束的布局(constraint-based layout)时,基于 约束的布局会“懒惰”地参与其中(例如,为一个视图添加约束)。 如果你在 -updateConstraints 方法中完成了所有的约束设置,如果没有人做约束,你甚至可能永远不会触发updateConstraints 消息。 要解决这个鸡和蛋的问题,如果你的窗口需要使用基于约束的布局,那么覆盖这个方法,并返回 YES

如果自定义视图不能正确使用 autoresizing 自动调整大小,则应覆盖此方法,并返回 YES,即:

+ (BOOL)requiresConstraintBasedLayout {
    return YES;
}

translatesAutoresizingMaskIntoConstraints 方法

返回一个布尔值,决定是否将视图的 autoresizing mask 转换为 Auto Layout 约束,默认值为 YES

@property(nonatomic) BOOL translatesAutoresizingMaskIntoConstraints API_AVAILABLE(ios(6.0)); // Default YES

如果此属性的值为 "YES",系统将创建一组约束,这些约束将重复视图的 autoresizing mask 所指定的行为。这也允许您使用视图的 frameboundscenter 属性来修改视图的大小和位置,使您可以在自动布局中创建静态的、基于 frame 的布局。

请注意,autoresizing mask 的约束完全指定了视图的大小和位置;因此,您不能添加额外的约束来修改此尺寸或位置而不引入冲突。如果要使用 Auto Layout 来动态计算视图的大小和位置,必须将此属性设置为 NO,然后为视图提供一个不含糊、不冲突的约束集。

默认情况下,该属性对于你在程序上创建的任何视图都被设置为 YES。如果你在 Interface Builder 中添加视图,系统会自动将此属性设置为 NO
—— 摘自 Apple Documentation > ... > UIView > translatesAutoresizingMaskIntoConstraints

默认情况下,视图的 autoresizing mask 会生成完全确定视图位置的约束。这使得自动布局系统能够跟踪通过手写视图布局的 frame(例如,通过 -setFrame: 方法手动设置视图的 frame 属性)。

当你通过代码方式使用自动布局(Auto Layout)来添加自己的约束并定位视图时,你必须将此属性设置为 NO。而在 Interface Builder 中是自动为你做这件事的。

另外,在使用 Masonry 框架实现 Auto Layout 自动布局约束时,会自动为你将 translatesAutoresizingMaskIntoConstraints 属性设置为 NO

参考

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