如何使convertToDeviceSpace做除了乘以一个之外的任何事情?

当我在CALayer运行这样的代码时

 override open func draw(in ctx: CGContext) { let rectDEVICESPACE = ctx.convertToDeviceSpace(bounds).size print("bounds \(bounds)") print("rectDEVICESPACE \(rectDEVICESPACE)") 

经过了很多很多很多分钟,我们发现不可能find任何转换或规模。

convertToDeviceSpace总是只返回相同的东西。

在这里输入图像说明

尝试设备,模拟器等山脉

convertToDeviceSpace除了身份之外还有什么特殊的情况呢?

这是可怕的,因为苹果文档和所有现有的代码示例使用完全相同的时候,例如,当你blitting周围找出原始像素的大小。 一个错误将是一个巨大的缺陷。

convertToDeviceSpace除了乘以1.0以外什么都可以做。

我在做什么错,特别是在testing中 – 除了身份以外,我从来没有看到任何结果?

我会回答我自己的问题,以帮助任何Google员工:

事实上

convertToDeviceSpace假定contentsScale给出像素密度!

这意味着这一点

实际上必须已经设置contentsScale自己!

以来!

苹果确实把contentScale默认为1,而不是屏幕密度!

基本上convertToDeviceSpace返回UIView的大小,时间, contentsScale

{另外,苹果公司将在未来的未知计算中获得“实际的,物理的”像素大小。}

这似乎是一个鲜为人知的事实:

在iOS中制作自定义图层时,假设您以像素为单位顺利绘制,实际上您必须设置contentsScale,而且您必须在初始化时执行此操作 。 (TBC,这是一个严重的错误,一旦画已经被称为上下文。)

 class PixelwiseLayer: CALayer { override init() { super.init() // SET THE CONTENT SCALE AT INITIALIZATION TIME contentsScale = UIScreen.main.scale } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } 

以下是对此问题的大量检查: https : //stackoverflow.com/a/47760444/294884