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

问题描述 投票:1回答:1

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

override open func draw(in ctx: CGContext) {

    let rectDEVICESPACE = ctx.convertToDeviceSpace(bounds).size

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

在尝试了许多很多分钟后,我们发现无法找到任何变换或规模。

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

enter image description here

试过山脉的设备,模拟器等。

什么是具体的实际情况,convertToDeviceSpace将做除身份以外的任何事情?

这是可怕的,因为Apple文档和所有现有的代码示例都使用了这一点,例如,当你在blitting时计算原始像素大小。错误将是一个巨大的缺陷。

什么是具体的实际情况,convertToDeviceSpace除了乘以1.0之外还会做什么?

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

ios calayer
1个回答
1
投票

我会回答我自己的问题,帮助任何googlers:

事实上

convertToDeviceSpace assumes that contentsScale gives the pixel density!

这确实意味着

you actually have to have already set the contentsScale yourself!!

以来!

Apple does leave the contentsScale defaulted to 1, rather than screen density!!!

基本上convertToDeviceSpace返回UIView大小,次数,contentsScale

{另外,Apple将在获得“实际的,物理的”像素大小时所做的任何未来不可知的计算。}

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

在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

© www.soinside.com 2019 - 2024. All rights reserved.