Ios 防止共享扩展中的UINavigationBar继承主应用程序外观设置

Ios 防止共享扩展中的UINavigationBar继承主应用程序外观设置,ios,swift,uinavigationbar,Ios,Swift,Uinavigationbar,我为我的用户创建了一个共享扩展,为此我必须在故事板中创建自己的UI。除了导航栏继承了主应用程序的外观之外,整个功能都很好。例如: 在纽约时报的应用程序中: 在Vice应用程序中: 我如何设置自己的外观 共享扩展旨在继承主应用程序的首选样式。你的两个例子说明了这一点,我想不起来有一个应用程序的共享扩展的样式是不同的 这包括彻底解决这一问题的努力,包括与苹果提交的rdar的链接 这不是您想要的答案,但似乎没有一种“非黑客”的方式来实现这一点。我要做的是将UINavigationBar子类化为MY

我为我的用户创建了一个共享扩展,为此我必须在故事板中创建自己的UI。除了导航栏继承了主应用程序的外观之外,整个功能都很好。例如:

在纽约时报的应用程序中:

在Vice应用程序中:


我如何设置自己的外观

共享扩展旨在继承主应用程序的首选样式。你的两个例子说明了这一点,我想不起来有一个应用程序的共享扩展的样式是不同的

这包括彻底解决这一问题的努力,包括与苹果提交的rdar的链接


这不是您想要的答案,但似乎没有一种“非黑客”的方式来实现这一点。

我要做的是将UINavigationBar子类化为MYNavigationBar,然后将我的自定义外观样式应用于MYNavigationBar


然后,我会在整个应用程序中使用MYNavigationBar而不是UINavigationBar(只需更改故事板中的类类型)。

正如其他答案所指出的那样,使用现有API根本无法做到这一点。我尝试将
UINavigationBar
子类化,甚至覆盖
tintColor
backgroundColor
之类的内容,但这也不起作用

我最后做的是使用一个视图,并将其样式设置为一个导航栏,效果很好。虽然有点黑,但仍然可以,因为它很可能永远不会与iOS的未来版本中断…

我找到了一种方法

只需用你的颜色画一个图像

func getTopWithColor(color: UIColor, size: CGSize) -> UIImage {
    let rect = CGRect(x: 0,y:  0,width: size.width,height: size.height)
    UIGraphicsBeginImageContextWithOptions(size, false, 0)
    color.setFill()
    UIRectFill(rect)
    //if let img = UIImage(named: "test.jpg") {
        //img.draw(in: CGRect(x: 0,y: 0,width: size.width,height: size.height))
    //    img.draw(in: CGRect(x: 0,y: 0,width: size.width,height: size.height), blendMode: .darken, alpha: 0.5)
    //}
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!

    UIGraphicsEndImageContext()
    return image
}


默认的ShareExtension控制器(我想是SLServiceController)没有这个问题,尽管您应该使用静态方法
appearance()
UIAppearance
API中为
UINavigationBar
UIToolbar
类传递外观设置,如本文所述。
override func viewDidLoad() {

let c = UIColor(red: 0.5765, green: 0.2784, blue: 0, alpha: 0.5)
    //c.withAlphaComponent(CGFloat(0))
    self.navigationController?.navigationBar.tintColor = UIColor.black
    let navSize = self.navigationController?.navigationBar.frame.size
    let image1 = getTopWithColor(color: c, size: navSize!)

    self.navigationController?.navigationBar.setBackgroundImage(image1, for: .default)