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