Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SFSafariViewController无暗模式和自定义条着色颜色_Ios_Swift_Sfsafariviewcontroller_Ios Darkmode - Fatal编程技术网

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:teal025teal100是自定义颜色

--更新---(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中我没有意识到这一点