当我在上下文中绘制文本时,为什么文本看起来像这样?

时间:2017-12-27 18:19:47

标签: ios swift uikit core-graphics

我正在编写一个教程,我应该在上下文中绘制文本。现在,为此,我使用此代码:

 UIGraphicsPushContext(context)
context.saveGState()
let pageBounds = self.bounds(for: box)
context.translateBy(x: 0.0, y: pageBounds.size.height)
context.scaleBy(x: 1.0, y: -1.0)

let string: NSString = "SIGNED"
let attributes: [NSAttributedStringKey: Any] = [
  NSAttributedStringKey.foregroundColor: #colorLiteral(red: 0.5, green: 0.5, blue: 0.5, alpha: 0.5),
  NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 30)
]

string.draw(at: CGPoint(x:250, y:40), withAttributes: attributes)
context.restoreGState()
UIGraphicsPopContext()

我不太明白这两行:

 context.translateBy(x: 0.0, y: pageBounds.size.height)
context.scaleBy(x: 1.0, y: -1.0)

我知道他们(合并)修改Quartz使用的坐标系以匹配UIKit坐标系。问题是,我无法直观地理解每条线路的作用。例如,当我注释掉这些行时,文本如下所示:

enter image description here

如果您可以解释每条线的作用,以及文字看起来如何,我将非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

想象一下你可能在学校里教过的笛卡尔坐标系统。 x坐标正向右延伸 y坐标正向上延伸。 这对iOS不起作用,因为y向下延伸。

context.translateBy(x: 0.0, y: pageBounds.size.height)

非常简单地通过pageBounds.size.height在y方向上移动原点,有效地将其向上移动到页面'到左上角。

context.scaleBy(x: 1.0, y: -1.0)

保持相同的比例,但翻转y坐标,使它们现在正向下延伸。

所以当你评论这些行时,你实际上是在说: 1.相对于左下角(0,0)绘制x y坐标。 2.绘制x从250开始,y从40开始。但是在这个坐标系统中,y:41将高于y:40而不是低于它。这就是它翻转文本的方式。

答案 1 :(得分:0)

context.translateBy(x: 0.0, y: pageBounds.size.height)

说明:在“上下文”

中更改用户坐标系的原点

(x: 0.0 ):在此上下文中,取代坐标空间x轴的数量为(0.0 /不变)。

(y: pageBounds.size.height):在此上下文中取代坐标空间y轴的数量为pageBounds.size.height

context.scaleBy(x: 1.0, y: -1.0)

说明:在此上下文中更改用户坐标系的比例。

(x: 1.0):将X轴上的刻度保持在1.0

(y: -1.0):在此上下文中,将Y轴上的比例反转1.0倍。

apple docs: translateByscaleBy