当我在CALayer
中运行这样的代码时
override open func draw(in ctx: CGContext) {
let rectDEVICESPACE = ctx.convertToDeviceSpace(bounds).size
print("bounds \(bounds)")
print("rectDEVICESPACE \(rectDEVICESPACE)")
在尝试了许多很多分钟后,我们发现无法找到任何变换或规模。
convertToDeviceSpace
总是只返回相同的东西。
试过山脉的设备,模拟器等。
什么是具体的实际情况,convertToDeviceSpace
将做除身份以外的任何事情?
这是可怕的,因为Apple文档和所有现有的代码示例都使用了这一点,例如,当你在blitting时计算原始像素大小。错误将是一个巨大的缺陷。
什么是具体的实际情况,convertToDeviceSpace
除了乘以1.0之外还会做什么?
我做错了什么,特别是在测试中 - 除了身份之外,我什么都看不到任何结果?
我会回答我自己的问题,帮助任何googlers:
事实上
这确实意味着
以来!
基本上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