Ios 如何使convertToDeviceSpace执行除乘以1以外的任何操作?

Ios 如何使convertToDeviceSpace执行除乘以1以外的任何操作?,ios,calayer,Ios,Calayer,当我在CALayer中运行这样的代码时 override open func draw(in ctx: CGContext) { let rectDEVICESPACE = ctx.convertToDeviceSpace(bounds).size print("bounds \(bounds)") print("rectDEVICESPACE \(rectDEVICESPACE)") 在尝试了很多很多很多分钟之后,我们发现不可能找到任何变换或缩放 convertT

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

override open func draw(in ctx: CGContext) {

    let rectDEVICESPACE = ctx.convertToDeviceSpace(bounds).size

    print("bounds \(bounds)")
    print("rectDEVICESPACE \(rectDEVICESPACE)")
在尝试了很多很多很多分钟之后,我们发现不可能找到任何变换或缩放

convertToDeviceSpace
总是返回相同的内容

大量的设备、模拟器等

什么是具体的实际情况其中
convertToDeviceSpace
将执行身份以外的任何操作

这是非常可怕的,因为苹果的文档和所有现有的代码示例都使用了这种方法,例如,当你四处走动时,计算原始像素的大小。一个错误将是一个巨大的缺陷

具体的实际情况是什么其中
convertToDeviceSpace
除了乘以1.0之外还能做什么


我做错了什么,特别是在测试中——除了身份,我从来没有看到任何结果?

我将回答我自己的问题,以帮助任何谷歌用户:

其实

convertToDeviceSpace假设contentsCale给出像素密度! 这确实意味着

实际上,您必须已经自己设置了内容缩放!! 从那时起

苹果确实将ContentsCale默认设置为1,而不是屏幕密度!!! convertToDeviceSpace返回UIView大小、时间、
ContentsCale

{另外,苹果公司在获得“实际的、物理的”像素大小时将进行的任何未来不可知的计算。}

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

在iOS中,当您创建自定义图层时,假设您正在以像素方式平滑地绘制它,实际上您必须设置ContentsCale-并且必须在初始化时进行设置。(TBC,一旦在上下文中调用了draw,则执行该操作将是一个严重错误。)

下面是对这个问题的一个广泛的研究:

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")
    }