// // WindowHelper.swift // TSLiveWallpaper // // Created by 100Years on 2024/12/20. // import UIKit open class WindowHelper { /// 获取当前的 keyWindow public static func getKeyWindow() -> UIWindow? { // 在 iOS 13 及以上,SceneDelegate 管理窗口 if #available(iOS 13.0, *) { return UIApplication.shared.connectedScenes .compactMap { $0 as? UIWindowScene } .flatMap { $0.windows } .first { $0.isKeyWindow } } else { // iOS 13 以下直接获取 keyWindow return UIApplication.shared.keyWindow } } /// 获取当前窗口,兼容 iOS 13 及以上版本 public static func getCurrentWindow() -> UIWindow? { if #available(iOS 13.0, *) { // iOS 13 及以上使用 `scene` 获取当前 window guard let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene else { return nil } return scene.windows.first { $0.isKeyWindow } } else { // iOS 12 及以下直接从 keyWindow 获取 return UIApplication.shared.keyWindow } } /// 获取当前根视图控制器 public static func getRootViewController() -> UIViewController? { guard let window = getCurrentWindow() else { return nil } return window.rootViewController } /// 获取当前的视图控制器 public static func getCurrentViewController() -> UIViewController? { var currentViewController = getRootViewController() while let presentedViewController = currentViewController?.presentedViewController { currentViewController = presentedViewController } return currentViewController } public static func topViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { if let nav = base as? UINavigationController { return topViewController(base: nav.visibleViewController) } else if let tab = base as? UITabBarController { return topViewController(base: tab.selectedViewController) } else if let presented = base?.presentedViewController { return topViewController(base: presented) } debugPrint("当前顶层 VC 是: \(base)") return base } } public func kGetScaleHeight(originalSize:CGSize,width:CGFloat) -> CGFloat { let originalScale = originalSize.width/originalSize.height let height = width/originalScale return height }