如何解决在 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 举报,一经查实,本站将立刻删除。