防止 Share Extension 中的 UINavigationBar 继承主应用程序外观设置
Prevent UINavigationBar in Share Extension from inheriting main application appearance settings
我为自己创建了一个共享扩展,为此我必须在故事板中创建自己的 UI。除了导航栏继承了主应用程序的外观之外,整个事情都很好。例如:
这是纽约时报应用程序中的内容:
在 Vice 应用程序中:
如何设置自己的外观?
共享扩展旨在继承主应用的首选样式。你的两个例子表明了这一点,我不记得有一个具有不同样式的共享扩展的应用程序。
此 question 包括解决此问题的彻底努力,包括指向向 Apple 提交的 rdar 的链接。
不是您想要的答案,但似乎没有 "non-hacky" 实现此目的的方法。
我会做的是将class UINavigationBar 作为MYNavigationBar,然后将我自定义的外观样式应用到MYNavigationBar。
然后我会在整个应用程序中使用 MYNavigationBar 而不是 UINavigationBar(只需更改情节提要中的 class 类型)。
正如其他答案所指出的那样,现有的 API 根本无法做到这一点。我尝试子类化 UINavigationBar
,甚至重写 tintColor
和 backgroundColor
之类的东西,但这也不起作用。
我最后做的是使用一个视图并将其样式设置为看起来像导航栏,效果很好。它有点 hacky,但它仍然可以,因为它很可能永远不会随着 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
}
.
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)
我为自己创建了一个共享扩展,为此我必须在故事板中创建自己的 UI。除了导航栏继承了主应用程序的外观之外,整个事情都很好。例如:
这是纽约时报应用程序中的内容:
在 Vice 应用程序中:
如何设置自己的外观?
共享扩展旨在继承主应用的首选样式。你的两个例子表明了这一点,我不记得有一个具有不同样式的共享扩展的应用程序。
此 question 包括解决此问题的彻底努力,包括指向向 Apple 提交的 rdar 的链接。
不是您想要的答案,但似乎没有 "non-hacky" 实现此目的的方法。
我会做的是将class UINavigationBar 作为MYNavigationBar,然后将我自定义的外观样式应用到MYNavigationBar。
然后我会在整个应用程序中使用 MYNavigationBar 而不是 UINavigationBar(只需更改情节提要中的 class 类型)。
正如其他答案所指出的那样,现有的 API 根本无法做到这一点。我尝试子类化 UINavigationBar
,甚至重写 tintColor
和 backgroundColor
之类的东西,但这也不起作用。
我最后做的是使用一个视图并将其样式设置为看起来像导航栏,效果很好。它有点 hacky,但它仍然可以,因为它很可能永远不会随着 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
}
.
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)