如何让 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")
}
下面是对这个问题的大量检查:
当我 运行 在 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")
}
下面是对这个问题的大量检查: