在 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) 方法分配barTintColornavigationBar

这里是示例代码

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

Swift : 动画 SKSpriteNode 渐变

如何在 Swift 中的 UI 标签栏上应用渐变?

如何在 iOS swift 运行时更新 CAGradientLayer 颜色?

如何在 Swift iOS 中实现 iMessage 渐变?

iOS 11 Swift 4 iPhone X Safe Area 支持全屏ScrollView