在 iOS 11 Swift 4 上应用渐变后 UINavigationBar 标题和按钮消失
Posted
技术标签:
【中文标题】在 iOS 11 Swift 4 上应用渐变后 UINavigationBar 标题和按钮消失【英文标题】:UINavigationBar Title and Buttons disappear after gradient is applied on iOS 11 Swift 4 【发布时间】:2017-10-27 06:51:27 【问题描述】:我最近使用 Swift 4 升级到 Xcode 9,它又更新了所有 ios 模拟器。 自更新以来,我发现在对 UINavigationBar 应用渐变之后;标题和按钮没有出现,但仍然具有功能。
这是应用我的渐变的代码 -
extension UIView
func applyNavGradient(colours: [UIColor]) -> Void
self.applyNavGradient(colours: colours, locations: nil)
func applyNavGradient(colours: [UIColor], locations: [NSNumber]?) -> Void
let gradient: CAGradientLayer = CAGradientLayer()
gradient.frame = self.bounds
gradient.colors = colours.map $0.cgColor
gradient.locations = locations
self.layer.addSublayer(gradient)
self.backgroundColor = UIColor.clear
class ViewController
override func viewDidLoad()
UINavigationBar.applyNavGradient(colours: redFade)
这曾经在带有 iOS10 的 Xcode 8 中工作 -
现在我得到的就是这个;
谁能给我一些关于为什么会发生变化的线索?
提前谢谢你!
克里斯。
【问题讨论】:
如何在UINavigationBar
中设置标题和按钮 - 您也可以添加此代码吗?
是的,当然/该按钮已在情节提要中设置并且永远不会更改。标题是它自己的 UINavigationItem 并且设置为; self.navTitle.title ="My Application"
IOS11 的变化是导航中的自定义控件必须有约束或者必须报告它的大小。如果您不这样做,您的控件的大小将为零。
好的。我明白了,等我回来再试一试。
我试过这个,但由于某种原因我无法让它工作。它不会让我添加约束,也不会让我为其设置大小。有什么建议吗?
【参考方案1】:
您可以使用UIColor.init(patternImage image: UIImage)
方法分配barTintColor
的navigationBar
这里是示例代码
func applyNavGradient(colours: [UIColor]) -> UIImage?
let gradientLayer: CAGradientLayer = CAGradientLayer()
gradientLayer.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: navigationController!.navigationBar.frame.size.height + navigationController!.navigationBar.frame.origin.y)
gradientLayer.colors = colours.map $0.cgColor
gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 1.0)
UIGraphicsBeginImageContext(gradientLayer.bounds.size)
gradientLayer.render(in: UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
之后就可以这样调用来设置渐变了
if let img = applyNavGradient(colours: [UIColor.red, UIColor.yellow])
navigationController?.navigationBar.barTintColor = UIColor(patternImage: img)
【讨论】:
以上是关于在 iOS 11 Swift 4 上应用渐变后 UINavigationBar 标题和按钮消失的主要内容,如果未能解决你的问题,请参考以下文章
如何在真实设备上的 iOS 10 中将渐变应用到 UIView
如何在 iOS swift 运行时更新 CAGradientLayer 颜色?