UIView / CALayer:在superview中转换触发器layoutSubviews

当改变UIView的一些属性时,它触发layoutSubviews中的layoutSubviews 。 在文档中找不到关于此的任何声明。

这些属性在superview和self中触发布局

  • 界限

这些属性仅在超视图中触发布局

  • 转变
  • layer.transform

这些属性只触发自我布局

  • 没有

这些属性不会触发任何布局

  • 中央
  • layer.anchorPoint
  • layer.position
  • α

我觉得转换触发布局非常混乱,而且这个位置和anchorPoint不会。

示例代码 : https : //github.com/hfossli/LayoutSubviewsInconsistency


我想知道:

  • 为什么我看到这种行为
  • 如果这真的是不一致的,或者如果我误解了一些核心概念
  • 每次我改变变形时如何避免superview到layoutSubviews

在文档和头文件中我找不到任何关于此的信息。 使用UIDynamics或类似的问题是显着的。

苹果通过TSI回答我(我个人认为这是垃圾):

第1部分

为什么我看到这种行为? 这是不一致还是我误解了一些核心概念?

只要系统感觉有什么变化,需要视图重新计算子视图的框架,视图就会被标记为布局。 这可能比您期望的更频繁发生,而系统select将视图标记为需要布局是实现细节时。

为什么它会向上级联视图层次结构?

通常,更改视图(或图层)的几何属性将会在视图层次结构中触发布局无效的级联,因为父视图可能具有涉及修改的子级的“自动布局”约束。 请注意,无论您是否明确启用自动布局,自动布局都以某种forms激活。

每次我改变转换的时候,如何避免superview到layoutSubviews?

没有办法绕过这个行为。 这是UIKit内部簿记的一部分,需要保持视图层次一致。

第2部分

您好Håvard,

但如果这是真的,我真的不明白为什么这不适用于'layer.anchorPoint'和'中心'/'layer.position'。

在这种情况下,我们可能会比较保守。 家长意见不需要关心他们的孩子的位置,除非自动布局涉及。 如果涉及到自动布局,则需要直接修改约束,以便在位置上进行持续调整。

这个转换触发layoutSubviews再次级联。

我的理解是,对变换的更改只会使视图的直接父级的布局无效(除非对已更改的视图设置了约束,则变得更复杂)。 此外,布局失效是批处理,所以你的父母的布局子视图的方法应该只被调用一次事务(框架)。 不过,我可以理解,如果布局逻辑复杂,这可能会导致性能问题。

有任何想法吗?

在中间视图中包装您的单元格内容。 当你修改这个中间视图的变换时,只有单元格的布局应该失效,所以你的昂贵的布局方法将不会被调用。

如果这不起作用,创build一些机制,告诉你昂贵的布局方法,当它实际上(或不)必须做的工作。 这可能是您设置的属性,只有您所做的更改是转换。