How can I set the UINavigationbar with gradient color?

前端 未结 11 730
花落未央
花落未央 2020-11-30 22:27

I want to set the UINavigationbar backgroundColor to a gradient color where I would like to set it via an array of colors to create a Gradient, ide

11条回答
  •  误落风尘
    2020-11-30 23:31

    This amazing tutorial from Lawrence Tan  shows how to set a gradient using barTintColor and no backgroundImage: https://medium.com/swift2go/add-gradient-to-navigation-bar-in-swift-9284fe91fea2

    Summary

    CAGradientLayer extension

    extension CAGradientLayer {
    
        class func primaryGradient(on view: UIView) -> UIImage? {
            let gradient = CAGradientLayer()
            let flareRed = UIColor(displayP3Red: 241.0/255.0, green: 39.0/255.0, blue: 17.0/255.0, alpha: 1.0)
            let flareOrange = UIColor(displayP3Red: 245.0/255.0, green: 175.0/255.0, blue: 25.0/255.0, alpha: 1.0)
            var bounds = view.bounds
            bounds.size.height += UIApplication.shared.statusBarFrame.size.height
            gradient.frame = bounds
            gradient.colors = [flareRed.cgColor, flareOrange.cgColor]
            gradient.startPoint = CGPoint(x: 0, y: 0)
            gradient.endPoint = CGPoint(x: 1, y: 0)
            return gradient.createGradientImage(on: view)
        }
    
        private func createGradientImage(on view: UIView) -> UIImage? {
            var gradientImage: UIImage?
            UIGraphicsBeginImageContext(view.frame.size)
            if let context = UIGraphicsGetCurrentContext() {
                render(in: context)
                gradientImage = UIGraphicsGetImageFromCurrentImageContext()?.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch)
            }
            UIGraphicsEndImageContext()
            return gradientImage
        }
    }
    

    Apply the gradient

    guard
        let navigationController = navigationController,
        let flareGradientImage = CAGradientLayer.primaryGradient(on: navigationController.navigationBar)
        else {
            print("Error creating gradient color!")
            return
        }
    
    navigationController.navigationBar.barTintColor = UIColor(patternImage: flareGradientImage)
    

提交回复
热议问题