CGAffineTransformIdentity和自动布局

时间:2014-07-25 21:08:30

标签: objective-c uiview transform identity cgaffinetransform

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

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

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

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

1 个答案:

答案 0 :(得分:6)

好问题。你对frame of a UIView becomes undefined after applying a transform that is not equal to CGAffineTransformIdentity

是正确的
  

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

但是,您可能不知道Auto Layout does not actually use the frame of a view to align it, but instead uses the "alignment rect" of the view。使用alignmentRectForFrame:检索视图的对齐rect。

文档指出

  

[{1}}]的默认实现会返回视图alignmentRectForFrame:修改的视图frame

并详细说,

  

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

所以,回答你的问题,

  

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

答案是,在一般情况下,您必须实施frameForAlignmentRect:alignmentRectForFrame:,并确保它们彼此相反。

This is a more thorough treatment of the issue,我建议你看看。