【发布时间】:2010-08-15 05:57:01
【问题描述】:
在 iOS 中,您必须对当前图形上下文应用翻转变换,以使文本的方向如图 16-1 所示。 [翻转变换] 涉及反转 y 轴并将原点平移到屏幕底部。清单 16-2 展示了如何在 iOS 视图的
drawRect:方法中应用此类转换。然后,此方法调用清单 16-1 中相同的MyDrawText方法。
为什么?这看起来很奇怪。
【问题讨论】:
在 iOS 中,您必须对当前图形上下文应用翻转变换,以使文本的方向如图 16-1 所示。 [翻转变换] 涉及反转 y 轴并将原点平移到屏幕底部。清单 16-2 展示了如何在 iOS 视图的
drawRect:方法中应用此类转换。然后,此方法调用清单 16-1 中相同的MyDrawText方法。
为什么?这看起来很奇怪。
【问题讨论】:
正如我在this answer 中展开的那样,Quartz 2D 坐标系使用左下角为 (0,0),这与 Mac 上的窗口坐标系相同。 iPhone 使用左上角作为 (0,0) 的视图布局,因此支持 UIView 的图层的坐标系围绕 Y 轴翻转。
如果您使用 NSString UIKit 扩展将文本绘制到 UIView 的支持层,它将被正确定位,因为这种翻转被考虑在内。但是,如果您使用较低级别的 Quartz 文本绘图,则需要先将坐标系围绕 Y 轴翻转(使 0,0 再次位于左下方)以正确定位。
普通核心图形上下文(用于绘制图像或 PDF 以进行存储或显示)不会反转,因此相反。普通的 Quartz 文本会渲染得很好,但是使用 NSString UIKit 扩展绘制的东西需要先反转坐标系。这会导致开发人员产生很多困惑,他们的图像和文本在绘制到屏幕时看起来正确,但在保存到磁盘时最终会颠倒。
至于为什么这样做,这是任何人的猜测。两种坐标系在某些情况下都有其优势。不过,这很容易纠正。
【讨论】: