如何让 convertToDeviceSpace 做除乘以 1 之外的任何事情?

How to make convertToDeviceSpace do anything other than multiply by one?

当我 运行 在 CALayer

中编写这样的代码时
override open func draw(in ctx: CGContext) {

    let rectDEVICESPACE = ctx.convertToDeviceSpace(bounds).size

    print("bounds \(bounds)")
    print("rectDEVICESPACE \(rectDEVICESPACE)")

尝试了很多很多分钟后,我们发现无法找到任何转换或缩放。

convertToDeviceSpace 总是 returns 同样的事情。

尝试了大量的设备、模拟器等

具体的实际情况是什么其中convertToDeviceSpace会做除身份之外的任何事情?

这很可怕,因为 Apple 文档和所有现有代码示例都使用了它,例如,当您四处奔波时计算原始像素大小。一个错误将是一个巨大的缺陷。

具体的实际情况是什么其中convertToDeviceSpace会做除了乘以1.0以外的任何事情?

我做错了什么,特别是在测试中 - 除了身份之外,我从未看到任何结果?

我会回答我自己的问题,以帮助所有 google 员工:

事实上

convertToDeviceSpace 假定 contentsScale 给出了像素密度!

这确实意味着

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

自从!

Apple 确实将 contentsScale 默认设置为 1,而不是屏幕密度!!!

基本上convertToDeviceSpace returns UIView 大小,倍数,contentsScale

{此外,Apple 在获取“实际、物理”像素大小时将进行的任何未来不可知的计算。}

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

在 iOS 中,当您制作自定义层时,假设您正在按像素平滑地绘制它,实际上 您必须设置 contentsScale - 并且您必须在初始化时这样做时间。 (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")
    }

下面是对这个问题的大量检查: