Ios SFSafariViewController无暗模式和自定义条着色颜色
我从我的应用程序中调用Ios SFSafariViewController无暗模式和自定义条着色颜色,ios,swift,sfsafariviewcontroller,ios-darkmode,Ios,Swift,Sfsafariviewcontroller,Ios Darkmode,我从我的应用程序中调用SFSafariViewController打开myurl。我更改了SFSafariViewController的条色。这在以下情况下效果良好: vc.preferredBarTintColor = UIColor.teal025 但是,当设备将外观样式模式从浅色更改为深色时,如果未使用PreferredBartinColor进行设置,则条形图着色颜色保持teal025,并且不会调整为较深的颜色,如默认条形图着色颜色(例如浅灰色到深灰色) 应用程序的主要部分也使用teal
SFSafariViewController
打开myurl
。我更改了SFSafariViewController
的条色。这在以下情况下效果良好:
vc.preferredBarTintColor = UIColor.teal025
但是,当设备将外观样式模式从浅色更改为深色时,如果未使用PreferredBartinColor
进行设置,则条形图着色颜色保持teal025,并且不会调整为较深的颜色,如默认条形图着色颜色(例如浅灰色到深灰色)
应用程序的主要部分也使用teal025作为导航栏的色调。当进入暗模式时,这些对象会根据需要自动调整颜色
如何使SFSafariViewController条的着色颜色具有相同的行为
下面是整个代码:
let urlString = "https://myurl"
if let url = URL(string: urlString) {
let vc = SFSafariViewController(url: url)
vc.preferredBarTintColor = UIColor.teal025 // this prevents dark mode change
vc.preferredControlTintColor = UIColor.teal100
present(vc, animated: true)
}
NB1:我不想使用UIWebView
,因为我的URL使用谷歌字体,使用UIWebView
在iOS上无法正确显示
NB2:teal025和teal100是自定义颜色
--更新---(10.01.2021)
根据要求,这里是我如何定义(d)我的颜色
extension UIColor {
static var teal025: UIColor { return UIColor(red: 0.0, green: 127.0/255.0, blue: 127.0/255.0, alpha: 1.0) } // 0x008080
}
--更新---(12.01.2021)
我的目标是拥有一个SFSafariViewController条色调,它与应用程序的导航条具有完全相同的色调、渐变和半透明性。我的导航类型为更喜欢大标题
样式以及滚动外观
。这两个属性处理自动明暗首选项更改以及半透明和垂直颜色渐变。我相信SFSafariViewController并没有为所有这些做好准备。因此,最接近的是UIColor的dynamicProvider初始值设定项,正如CSmith所建议的那样。这将“仅”解决亮/暗偏好的变化
let urlString = "https://myurl"
if let url = URL(string: urlString) {
let vc = SFSafariViewController(url: url)
vc.preferredBarTintColor = UIColor.safariBarTint
vc.preferredControlTintColor = UIColor.safariControlTint
present(vc, animated: true)
}
extension UIColor {
struct Material {
static var orangeA100: UIColor { return UIColor(red: 0xff / 0xff,
green: 0xd1 / 0xff,
blue: 0x80 / 0xff,
alpha: 1.0) } // #FFD180
...
static var orangeA700: UIColor { return UIColor(red: 0xff / 0xff,
green: 0x6d / 0xff,
blue: 0x00 / 0xff,
alpha: 1.0) } // #FF6D00
}
}
static var safariBarTint: UIColor {
if #available(iOS 13.0, *) {
return UIColor { (traits: UITraitCollection) -> UIColor in
return traits.userInterfaceStyle == .dark ?
UIColor.Material.orangeA700 :
UIColor.Material.orangeA100
}
} else { // for iOS 12 and earlier
return UIColor.Material.orangeA100
}
}
static var safariControlTint: UIColor {
if #available(iOS 13.0, *) {
return UIColor { (traits: UITraitCollection) -> UIColor in
return traits.userInterfaceStyle == .dark ?
UIColor.Material.orangeA100 :
UIColor.Material.orangeA700
}
} else { // for iOS 12 and earlier
return UIColor.Material.orangeA700
}
}
我相信应用程序的导航栏和SFSafariViewController之间的1:1颜色调整必须手动完成,因此仍然是在黑暗中拍摄
我相信上面的代码是我能得到的最接近的代码。我观察到
SFSafariViewController
正确地考虑了UIColor
设置为preferredbartincolor
的明暗变化。UIColor扩展中的teal025定义了单一颜色变体(0x008080),并且没有单独的暗模式颜色
要解决此问题,请在颜色资源目录中定义teal025,并使用以下命令加载值:
preferredbartincolor=UIColor.init(名为:“teal025”)
确保通过为设置<代码>外观选择“任意,深色”,在颜色资源中同时定义深色和浅色变体,然后为每个变体设置适当的颜色
或者,使用UIColor的dynamicProvider初始值设定项在运行时返回暗模式和亮模式变量,如下所示:
extension UIColor
{
static var teal025: UIColor
{
if #available(iOS 13.0, *)
{
return UIColor { (traits: UITraitCollection) -> UIColor in
// Return one of two colors depending on light or dark mode
return traits.userInterfaceStyle == .dark ?
UIColor(red: 0.0, green: 0.5, blue: 0.5, alpha: 1) :
UIColor(red: 0.0, green: 0.4, blue: 0.4, alpha: 1)
}
}
else
{
// for iOS 12 and earlier
return UIColor(red: 0.0, green: 0.5, blue: 0.5, alpha: 1)
}
}
}
最后,在更好地理解您的问题后,您可能会感觉到,由于条形半透明性,
SFSafariViewController
bar tint color与您的应用程序不同。目前无法访问SFSafariViewController
的UINavigationBar
来禁用半透明性。您的代码可以正常工作。然而,我(可能是错误地)有这样一种“印象”,即当从明暗模式更改为暗模式时,即使是自定义颜色也会自动更改,就像故事板中定义的色调一样。难道不可能在代码中定义一个UIColor,它可以自动地(您的代码可以这样做,但可以手动地)实现这一点吗?如果没有,我如何确定暗模式颜色的(系统生成的)RGB值,给定特定的亮模式颜色?我编辑了答案,以显示颜色资源目录作为首选方法,这将在用户更改设备暗/亮模式设置时处理自动更新。请注意,没有以下概念:“给定特定的光模式颜色,系统生成暗模式颜色的RGB值“。您可以决定teal025在暗模式和亮模式下始终为0x008080,或者稍微调整RGB值以获得最佳外观。您说首选资产目录方法,因为当用户更改亮/暗首选项时,它将自动处理更改。我现在使用了您建议的扩展UIColor代码,这一代码还可以在更改明/暗首选项后立即更改所需的UI。换句话说。。。在这方面,我看不出asset catalog和extension UIColor code方法之间有什么区别。遗憾的是,SFSafariViewController的navigationController属性似乎为零,因此您无法访问navigationBar来执行禁用半透明之类的操作,至少在iOS 14中我没有意识到这一点