我正在使用 Xcode 11 beta 开发 iOS 13。有什么办法可以在网页视图上支持暗模式吗?我已经为除 WKWebviews 之外的所有其他视图创建了颜色集。如何更改深色模式的网页视图背景和文本颜色?
假设您的问题是询问如何根据浅色模式或深色模式是否有效来更改在 WKWebView 中显示的 HTML 内容的颜色,则您在应用程序的代码中无需执行任何操作。所有更改都需要在 HTML 内容使用的 CSS 中进行。
我有一些在 WKWebView 中使用的本地 HTML 文件。我能够通过更新我的 css 文件来支持暗模式。
假设您当前有一个包含以下内容的 css 文件:
body {
background-color: white;
color: black;
}
a:link {
color: #0078b5;
text-decoration: none;
}
这些在灯光模式下都很好。为了也支持深色模式,您可以在 css 中添加
@media
部分:
@media (prefers-color-scheme: dark) {
body {
background-color: rgb(38,38,41);
color: white;
}
a:link {
color: #0096e2;
}
a:visited {
color: #9d57df;
}
}
在深色模式下,此
@media
部分中的颜色将覆盖 @media
部分之外定义的相应颜色。
斯威夫特5
对于
WKWebView
,下面的代码对我有用。
extension RichTextController : WKNavigationDelegate {
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
let cssString = "@media (prefers-color-scheme: dark) {body {color: white; background: black;}a:link {color: #0096e2;}a:visited {color: #9d57df;}}"
let jsString = "var style = document.createElement('style'); style.innerHTML = '\(cssString)'; document.head.appendChild(style);"
webView.evaluateJavaScript(jsString, completionHandler: nil)
}
}
更简单,只需反转除图像之外的所有颜色和样式即可:
@media (prefers-color-scheme: dark) {
html{
filter: invert(1) hue-rotate(.5turn);
}
img {
filter: invert(1) hue-rotate(.5turn);
}
}
我在迁移 iOS 应用程序时遇到了同样的挑战,因为我们使用
WKWebView
登录,当我咨询时,我发现下面的示例可以处理这种情况。只需要为颜色创建变量并需要在 CSS 中处理它。
之前
body { color: black; }
h1 { color: white; }
.header {
background-color: #FFFFFF;
color: white;
}
之后
:root {
color-scheme: light dark;
--h1-color: #333;
--header-bg-clr: #FFF1FF;
--header-txt-clr: white;
}
@media (prefers-color-scheme: dark) {
:root {
color-scheme: light dark;
--h1-color: #333;
--header-bg-clr: #FFF1FF;
--header-txt-clr: white;
}
}
body { }
h1 { color: var(--h1-color); }
.header {
background-color: var (--header-bg-clr);
color: var(--header-txt-clr);
}
集成此更改后,您可以使用 Safari 进行测试(首先您需要在 Sarafi、首选项、高级中启用开发人员菜单选项)。打开 wen 检查器(使用 Command + Options + I),您将看到此屏幕,其中包含切换亮/暗模式的选项。
注意 只是添加更多信息。您还可以像处理颜色一样处理不同的图像。
之前
<img src="day.jpg">
之后
<picture>
<source srcset="light.jpg" media="(prefers-color-scheme: light)">
<img src="day.jpg">
</picture>
根标签将反转所有组件的颜色,除了表格和图像将呈负数形式。
要执行完美的颜色反转,请检查以下 CSS 文件
@media (prefers-color-scheme: dark) {
/* root tag inverting all the components color except the table.*/
: root {
color-scheme: light dark;
filter: invert(100%);
-webkit-filter: invert(100%)
}
/*table tag needed for inverting table content.*/
table {
filter: invert(100%);
}
/* If We do color invert in : root , images will be color inverted and it will be in negative. If we invert again these negative images, it will be positive.*/
img {
filter: invert(100%);
}
}