CGAffineTransformIdentity和自动布局

Old*_*ame 3 identity transform objective-c uiview cgaffinetransform

是否可以将转换标识设置为当前转换状态?我关注的是使用自动布局,并且一旦应用了转换,框架现在是未定义的.这只是一个抽象的思维过程,实际上可能不是一个问题.

假设我应用了一个CGAffineTransformMakeScale(1,-1)翻转UIView一个超级视图的子视图.现在我已经将一个转换应用于subView框架:现在变得未定义,那么如果我调整superView的尺寸,那将如何影响superView中subView的大小和位置?

我的思维过程告诉我,如果我可以将"CGAffineTransformIdentity"设置为当前转换状态(例如在翻转或旋转之后),我设置的任何自动布局都将被正确处理,但如果没有设置,我将无法获得适当的自动布局处理.

所以我需要担心框架:未定义或自动布局是否使用转换视图的边界:?

rav*_*ron 6

好问题.在应用不等于的变换后frame,a的UIView变为未定义CGAffineTransformIdentity是正确的:

...如果transform属性包含非标识转换,则frame属性的值是未定义的,不应修改.在这种情况下,您可以使用center属性重新定位视图,并使用属性调整大小bounds.

但是,您可能不知道" 自动布局"实际上并未使用frame视图对齐它,而是使用视图的"对齐矩形".使用查找视图的对齐rect alignmentRectForFrame:.

文档指出

默认实现[of alignmentRectForFrame:]返回由视图frame修改的视图alignmentRectInsets.

并详细说,

大多数自定义视图都可以覆盖alignmentRectInsets以指定其内容在其框架内的位置.需要任意转换的自定义视图可以覆盖alignmentRectForFrame:frameForAlignmentRect:描述其内容的位置.这两种方法必须始终相互反转.

那么,回答你的问题,

所以我需要担心框架:未定义或自动布局是否使用转换视图的边界:?

答案是,在一般情况下,你将不得不实施alignmentRectForFrame:frameForAlignmentRect:,并确保他们是彼此的逆.

这是对问题的更彻底的处理,我建议你看看.