不管是UIView,還是UIViewController或者子類
在切換 ”設置“ 中的 “顯示與亮度” 中 模式時,都會調用一個方法,這個方法是系統API
swift:
//MARK:暗黑模式監聽 override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) if #available(iOS 13.0, *) { if self.traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { if UITraitCollection.current.userInterfaceStyle==UIUserInterfaceStyle.dark { //暗黑模式 }else{ //明亮模式 } } } else { // Fallback on earlier versions } }
oc:
//MARK:暗黑模式監聽 - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection{ [super traitCollectionDidChange:previousTraitCollection]; if (@available(iOS 13.0, *)) { if ([[UITraitCollection currentTraitCollection] userInterfaceStyle]==UIUserInterfaceStyleDark) { } else{ } } else { // Fallback on earlier versions } }
往往在初始化View時也要區分一下,是明亮模式還是暗黑模式。即使一上來會調用以上的方法,畢竟在VC中創建View不會寫到以上代理方法。
swift:
if #available(iOS 13.0, *) { if UITraitCollection.current.userInterfaceStyle==UIUserInterfaceStyle.dark { //暗黑模式 }else{ //明亮模式 } } else { // Fallback on earlier versions }
oc:
if (@available(iOS 13.0, *)) { if ([[UITraitCollection currentTraitCollection] userInterfaceStyle]==UIUserInterfaceStyleDark) { } else{ } } else { // Fallback on earlier versions }
對顏色的適配就是這樣的。
而圖片適配請參考:https://www.jianshu.com/p/476cac3851c8?utm_campaign=maleskine
///////////////////////////////////////////////////////////////////////////
額外的,對WKWebView適配:在didFinished代理方法里面寫
//適配暗黑模式 var backgroundColor : String = "" var labelColor : String = "" if #available(iOS 13.0, *) { if UITraitCollection.current.userInterfaceStyle==UIUserInterfaceStyle.dark { //暗黑模式 backgroundColor = "\"#000000\""; labelColor = "'#828282'"; }else{ //明亮模式 backgroundColor = "\"#FFFFFF\""; labelColor = "'#666666'"; } } else { // Fallback on earlier versions } webView.evaluateJavaScript(String(format: "document.body.style.backgroundColor=%@", backgroundColor)) { (obj, error) in } webView.evaluateJavaScript(String(format: "document.getElementsByTagName('body')[0].style.webkitTextFillColor=%@", labelColor)) { (obj, error) in }