在 Swift 中,有没有办法从被扩展覆盖的 getter 访问本机属性?

如何解决在 Swift 中,有没有办法从被扩展覆盖的 getter 访问本机属性?

我有一个使用库的 iOS 应用。当 iOS 或 iPadOS 设备或模拟器在系统设置中设置为缩放模式时,此库曾经出现问题。该库的开发人员提供了一个修复程序,但他告诉我,为了从修复程序中受益,我必须使用 UIScreen nativeScale 而不是 scale。我试图通过声明这样的扩展来在不影响其余项目代码的情况下解决问题:

extension UIScreen {

    open var scale: CGFloat {
        get {
            return nativeScale
        }
    }
}

这有效,但我想以某种方式使此扩展仅在设备设置为缩放模式时有效。我找到了一种检测方法,但现在我不知道如何进行。我知道我无法从其 getter 中访问 scale 属性,所以我想知道是否有可能的实现来实现这一点。感谢您的关注。

解决方法

Cristik 的评论让我想到了一个解决方案。 Cristik 要求提供检测缩放模式的代码。我在 DeviceKit 存储库中找到了一个很好的实现。解决方法如下:

public var isZoomed: Bool? {
    guard isCurrent else { return nil }
    if Int(UIScreen.main.scale.rounded()) == 3 {
      // Plus-sized
      return UIScreen.main.nativeScale > 2.7 && UIScreen.main.nativeScale < 3
    } else {
      return UIScreen.main.nativeScale > UIScreen.main.scale
    }
}

为了实现我的目标,我在 DeviceKit 中添加了这个属性:

public var originalDeviceScale: CGFloat? {
    guard isCurrent else { return nil }
  
    return UIScreen.main.scale
}

在一个完全不同的目标中,我在主项目中对 UIScreen 的扩展不适用,所以我现在可以写:

import UIKit
import DeviceKit

extension UIScreen {

    open var scale: CGFloat {
        get {
        
            let device = Device()
        
            guard let isZoomed = device.isZoomed else {
                return -1
            }
        
            if isZoomed {
                return nativeScale
            }
        
           guard let originalDeviceScale = device.originalDeviceScale else {
              return -1
           }
        
        return originalDeviceScale
    }
}

如果您不使用 DeviceKit,您可以将静态库目标添加到您的项目中,该目标仅包含 originalNativeScale 属性。 我知道这不是一个完整的解决方案,但可能对其他人有用。感谢您的关注。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?