lorenzo
lorenzo

Reputation: 1743

SwiftUI NavigationBar Background Gradient on iPad

I'm passing my UIKit app to SwiftUI and struggle to make this work.

I want to put a left to right gradient on each navigation bars of my double column iPad display.

I've tried various approach but never quite make it.

Upvotes: 0

Views: 1089

Answers (1)

lorenzo
lorenzo

Reputation: 1743

Using FRIDDAY's answer from How change background color if using NavigationView in SwiftUI?, I achieved the much appreciated gradient:

extension UINavigationController {
    
    override open func viewDidLoad() {
        
        super.viewDidLoad()
        
        let gradient = CAGradientLayer()
        
        gradient.frame = self.view.bounds
        gradient.colors = [UIColor(Colors.red).cgColor, UIColor(Colors.orange).cgColor]
        gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
        gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
        
        let standard = UINavigationBarAppearance()
        standard.backgroundImage = gradient.toImage()

        let compact = UINavigationBarAppearance()
        compact.backgroundImage = gradient.toImage()

        let scrollEdge = UINavigationBarAppearance()
        scrollEdge.backgroundImage = gradient.toImage()

        self.navigationBar.standardAppearance = standard
        self.navigationBar.compactAppearance = compact
        self.navigationBar.scrollEdgeAppearance = scrollEdge
        
    }
    
}

extension CALayer {

    func toImage() -> UIImage {
        UIGraphicsBeginImageContext(self.frame.size)
        self.render(in: UIGraphicsGetCurrentContext()!)
        let outputImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return outputImage!
    }
    
}

Upvotes: 2

Related Questions