如何使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