如何用10行代码让app全局置灰?

27 min read

在iOS的开发中,可以通过设置应用的Window的颜色滤镜来实现全局置灰的效果。具体代码如下:

  1. 导入UIKit框架
import UIKit
  1. 定义一个自定义的Window类,继承自UIWindow
class GrayWindow: UIWindow {
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        updateAppearance()
    }
    
    private func updateAppearance() {
        if #available(iOS 13.0, *) {
            if traitCollection.userInterfaceStyle == .dark {
                self.accessibilityIgnoresInvertColors = true
                let filter = UIAccessibilityFilterGenerator.invertFilter()
                self.accessibilityViewIsModal = true
                self.accessibilityIgnoresInvertColors = true
                self.layer.filters = [filter]
            } else {
                self.accessibilityViewIsModal = false
                self.accessibilityIgnoresInvertColors = false
                self.layer.filters = []
            }
        } else {
            let filter = UIColor.gray.withAlphaComponent(0.6)
            self.layer.filters = [filter]
        }
    }
}
  1. 在AppDelegate的application(_:didFinishLaunchingWithOptions:)方法中,将应用的Window设置为自定义的GrayWindow
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // 创建自定义的GrayWindow并设置为应用的Window
    self.window = GrayWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = RootViewController() // 将自己的根视图控制器设置为项目中的根视图控制器
    self.window?.makeKeyAndVisible()
    
    return true
}

通过以上的代码,会将应用的Window设置为全局置灰的效果。需要注意的是,上面的代码只适用于iOS 10及以上的系统版本,低版本的系统可能需要额外的处理。

值得一提的是,置灰效果也可以通过改变应用的主题来实现,不过这种方式不是通过10行代码完成的。