UIInterfaceOrientation、CGAffineTransform、框架、边界和中心

Posted

技术标签:

【中文标题】UIInterfaceOrientation、CGAffineTransform、框架、边界和中心【英文标题】:UIInterfaceOrientation, CGAffineTransform, Frame, Bounds and Center 【发布时间】:2011-01-13 01:16:45 【问题描述】:

有人能指出我上面的一个很好的入门,当你和其他人搞混时会发生什么?似乎无论我做什么,一旦我开始弄乱状态栏方向或视图变换(即使我所做的只是 90 度旋转),我都可以指望我的视图最终会横向,向上上下颠倒,在一个令人沮丧的下午尝试和错误试图让它们理顺。我敢肯定,一旦您知道了逻辑以及应用所有内容的顺序,这一切就都说得通了,但到目前为止,凭经验,我还无法弄清楚。

【问题讨论】:

我做到了,但我很抱歉说它没有多大帮助。我已经阅读了 UIView 类参考,并且我已经知道所有单词的含义。 WWDC 2011 上的“UIView 绘图”会议涵盖了这个主题,它可能会有所帮助。 【参考方案1】:

我不知道关于该主题的好的单文档入门,但以下是我从经验和阅读文档中学到的知识。

中心、边界和框架

如果您设置框架,则中心和边界将被更新。如果您设置中心或边界,则框架将被更新。 Frame 是一种使用超级视图的坐标系来操作中心和边界的便捷方法。

来自UIView Class Reference:

视图的几何形状由其框架、边界和中心属性定义。框架定义了视图在其父视图的坐标系中的原点和尺寸,通常在布局时用于调整视图的大小或位置。 center 属性可以用来调整视图的位置而不改变它的大小。边界定义视图的内部尺寸,因为它看到它们并且几乎专门用于自定义绘图代码。框架和边界矩形的大小部分耦合在一起,因此更改任一矩形的大小都会更新两者的大小。

更多详情请见The Relationship of the Frame, Bounds, and Center Properties。

变换

如果您将转换属性设置为身份转换以外的其他内容,则框架未定义。如果将变换设置为其他值,则应仅使用中心(以将视图定位在其超级视图中)和边界(以调整视图的大小)来操作视图几何。以下是来自UIView Class Reference的相关信息:

变换的原点是 center 属性的值,或者是 layer 的 anchorPoint 属性(如果它被改变了)。 (使用 layer 属性获取底层 Core Animation 图层对象。)默认值为 CGAffineTransformIdentity。

...

警告如果变换属性不是恒等变换,则该属性的值未定义,因此应被忽略。

更多详情请见Coordinate System Transforms。

UIInterfaceOrientation

UIInterfaceOrientation 不会直接影响变换、边界、中心或框架属性。但是,当设备方向发生变化时,视图控制器会自动调整其子视图的大小(这会反过来调整其子视图的大小等等)。

请参阅Responding to Device Orientation Changes 和View Controller View Resizing 了解更多详情。

【讨论】:

“如果您将变换设置为其他内容,您应该只使用中心和边界来操作视图几何体”是我听到的关于该主题的最佳建议。谢谢!

以上是关于UIInterfaceOrientation、CGAffineTransform、框架、边界和中心的主要内容,如果未能解决你的问题,请参考以下文章

警告:从枚举类型“UIInterfaceOrientation”到不同枚举类型“UIDeviceOrientation”的隐式转换?

状态栏保持横向,而 UIInterfaceOrientation 只是纵向

如何从 info.plist 中获取和使用 UIInterfaceOrientation 项目?

多个视图的 Swift UIInterfaceOrientation

UIInterfaceOrientation 无法确定 iOS 7 和 iOS 8 iPhone 上的界面方向

CGImageRef cg = [[UIImage imageNamed: Path] CGImage];需要 CGImageRelease(cg)'?