以编程方式启用安全区域



有没有办法以编程方式启用安全区域?

上下文:我正在使用的应用程序被粘在iOS 7作为目标上,这可能不会改变一段时间。除非我删除iOS 7和8兼容性,否则XCode将不接受启用安全区域。大多数观点是XIB。有条件的安全区域将是理想的。

有条件的安全区域支持xib

不,没有多平台xib之类的东西。您可以尝试重复XIB,独立构建XIB,并根据iOS版本有条件地访问它们,但肯定不建议这样做!您将需要更多的XIB和复杂性。根据SafeareAinsets的不同,将约束从代码中放置和更改其常数要容易得多。

实际安全区域支持代码

与对旧Xcode 7/swift 2的添加iPhone x布局支持相似的情况:

拥有安全区域支持的唯一方法是使用Xcode 9构建。

使用Xcode 9后,您可能会有条件代码:

swift

extension UIApplication {
    class var safeAreaInsets: UIEdgeInsets {
        if #available(iOS 11.0, tvOS 11.0, *) {
            return UIApplication.shared.delegate?.window??.safeAreaInsets ?? UIEdgeInsets.zero
        }
        return UIEdgeInsets.zero
    }
}

objc

@interface UIApplication (extension)
+ (UIEdgeInsets)safeAreaInsets;
@end
@implementation UIApplication (extension)
+ (UIEdgeInsets)safeAreaInsets {
    if (@available(iOS 11.0, tvOS 11.0, *)) {
        UIWindow *window = UIApplication.sharedApplication.delegate.window;
        return window != nil ? window.safeAreaInsets : UIEdgeInsetsZero;
    }
    return UIEdgeInsetsZero;
}
@end

模拟代码的安全区域支持

现在,让我们面对现实吧,没有那么多不同的设备形状可以支撑(只有三种情况:带有顶峰的肖像,带有顶峰的景观,其他景观)。因此,您可以根据机器模型构建自己的安全区域值,它可能会帮助您使用Xcode的旧版本:

extension UIApplication {
    /// on iPhone X+ portrait: top : 44.0, left : 0.0, bottom : 34.0, right : 0.0
    /// on iPhone X+ landscape: top : 0.0, left : 44.0, bottom : 21.0, right : 44.0
    /// on olders: top : 20.0, left : 0.0, bottom : 0.0, right : 0.0
    class var safeAreaInsetsSimulated: UIEdgeInsets {
        let model: String
        if TARGET_OS_SIMULATOR != 0 {
            model = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] ?? ""
        } else {
            var size = 0
            sysctlbyname("hw.machine", nil, &size, nil, 0)
            var machine = [CChar](repeating: 0, count: size)
            sysctlbyname("hw.machine", &machine, &size, nil, 0)
            model = String(cString: machine)
        }
        // will need adjustment in 2019
        if model == "iPhone10,3" || model == "iPhone10,6" || model.starts(with: "iPhone11,") {
            switch UIApplication.shared.statusBarOrientation {
            case .landscapeRight, .landscapeLeft:
                return UIEdgeInsets(top: 0, left: 44, bottom: 21, right: 44)
            default:
                return UIEdgeInsets(top: 44, left: 0, bottom: 34, right: 0)
            }
        }
        return UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)
    }
}

请注意,在第一件代码中,默认情况下返回 UIEdgeInsets.zero,在最后一块代码i默认情况下返回 UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0):这只是选择问题,具体取决于您要处理的方式,因为Apple可以选择在iOS 11和iOS 12之间重新定义它,导致兼容性引起很多痛苦。

相关内容

  • 没有找到相关文章

最新更新