【问题标题】:How to make convertToDeviceSpace do anything other than multiply by one?如何让 convertToDeviceSpace 除了乘以一之外做任何事情?
【发布时间】:2017-12-11 22:25:44
【问题描述】:

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

override open func draw(in ctx: CGContext) {

    let rectDEVICESPACE = ctx.convertToDeviceSpace(bounds).size

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

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

convertToDeviceSpace 总是返回相同的东西。

尝试过大量设备、模拟器等。

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

这太可怕了,因为 Apple 文档和所有现有代码示例都使用了这种方法,例如,当你四处移动时计算出原始像素大小。一个错误将是一个巨大的缺陷。

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

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

【问题讨论】:

    标签: ios calayer


    【解决方案1】:

    我会回答我自己的问题,以帮助任何谷歌员工:

    事实上

    convertToDeviceSpace 假设 contentsScale 给出像素密度!

    这确实意味着

    实际上必须已经自己设置contentScale!!

    自从!

    Apple确实将 contentsScale 默认为 1,而不是屏幕密度!!!

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

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

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

    在 iOS 中,当您制作自定义图层并假设您以像素方式平滑地绘制它时,实际上您必须设置 contentsScale - 而且您必须在初始化时这样做。 (待定,一旦在上下文中调用了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")
        }
    

    以下是对该问题的详细检查:https://stackoverflow.com/a/47760444/294884

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      相关资源
      最近更新 更多