您提供给绘图例程的数字通常与您要绘制的视图紧密相关,特别是在使用drawRect:
方法时。 每个视图的本地坐标系统从左上角开始。
在iOS 7和更高版本中,视图控制器的起点可能会也可能不会从导航栏下面开始,具体取决于您如何设置控制器的edgesForExtendedLayout
属性。默认情况下,视图现在延伸到bars下,提供了边缘到边缘的UI体验。
Frame和Bounds
视图(至少)存在于两个世界。每个视图的frame
属性都在其父视图对象的坐标系中定义。它指定一个矩形,标记视图在该父视图中的位置和大小。视图的bounds
属性在其自己的坐标系中定义,因此它的原点默认为(0,0)。(当您只显示视图的一部分时,例如使用滚动视图时,这可以改变。)视图的bounds和frame紧密耦合。更改视图的frame大小会影响它的bounds,反之亦然。
如图 2-2 。灰色视图的原点从位置(80,100)开始。它水平延伸200点,垂直延伸150点。其父坐标系中的frame是{80,100,200,150}。 在其自己的坐标系中,其bounds是{0,0,200,150}。 相对的原点改变,延伸程度(尺寸大小)保持不变 。
Gray View | Parent | |
---|---|---|
Origin | {0, 0} | {80, 100} |
Circle | {66, 86} | {146,186} |
图 2-2 任何点的位置取决于它所在的坐标系。
点的位置取决于定义的坐标系。在图 2-2 中,圆圈围绕灰色视图中的一个点。在灰色视图的坐标系中,该点出现在位置(66,86)处,即,距离灰色视图原点向右66个点,向下86个点。
在父视图的坐标系中,该点对应于位置(146,186)。在父视图原点(白色背景图的左上角)的向右146点和向下186点的位置。要从灰色视图的坐标系统转换到父级的坐标系统,请将灰色视图的原点(80,100)添加到该点。 结果是(66 + 80,100 + 86)或(146,186)。
Note
视图frame由bounds,center和应用于视图的任何变换计算得来。它表示包含在父视图内的视图的最小矩形。
坐标系之间转换
iOS SDK提供了几种在坐标系之间转换的方法。例如,您可能想将点的位置从当前视图的坐标系统转换为其父视图的坐标系统,以确定绘制点落在父视图中的位置。你应该怎么做,方法如下:
1 | CGPoint convertedPoint = [outerView convertPoint:samplePoint fromView:grayView]; |
您可以在任何视图实例上调用该转换方法。指定是否要将点转换到另一个坐标系(toView:
)或从另一个坐标系转换到当前坐标系(fromView:
),如在此示例中所做的。
转换坐标系操作所涉及的视图必须在同一个UIWindow
内,否则这样转换不会有意义。然而,视图间不必具有任何特定的关系。他们可以是兄弟姐妹,父/子,祖先/孩子,或着其他任何。这些方法会返回相对于您指定的原点的坐标。
转换操作适用于矩形以及点。要将矩形从当前视图坐标系转换为另一个坐标系,请使用convertRect:fromView:
. 要转换回来,请使用convertRect:toView:
.
本文翻译自《iOS Drawing Practical UIKit Solutions》作者:Erica Sadun,翻译:Cheng Dong。如果觉得本书不错请购买支持正版:亚马逊购买传送门,本书所有源代码可在GitHub上下载。译者虽然力求做到信,达,雅,但是由于时间仓促加之译者水平十分有限,文中难免会出现不正确,不准确,词不达意,难于理解的地方,还望各位批评指正,共同进步,谢谢。转载请注明出处。