Search code examples
xcodecolorsnavigationswiftui

How to turn off NavigationLink overlay color in SwiftUI?


I've designed a "CardView" using ZStack in which the background layer is a gradient and the foreground layer is a PNG(or PDF) image(the image is a yellow path(like a circle) drawn in Adobe Illustrator).

When I put the ZStack inside a NavigationLink the gradient remains unchanged and fine, but the image get a bluish overlay color (like default color of a button) therefore there is no more yellow path(the path is bluish).

How can get the original color of foreground PNG(or PDF) image?


import SwiftUI

struct MyCardView : View {
    let cRadius : CGFloat = 35
    let cHeight : CGFloat = 220
    var body: some View {
        NavigationView {
            NavigationLink(destination: Text("Hello")) {
                ZStack {
                    RoundedRectangle(cornerRadius: cRadius)
                        .foregroundColor(.white)
                        .opacity(0)
                        .background(LinearGradient(gradient: Gradient(colors: [Color(red: 109/255, green: 58/255, blue: 242/255),Color(red: 57/255, green: 23/255, blue: 189/255)]), startPoint: .leading, endPoint: .trailing), cornerRadius: 0)
                        .cornerRadius(cRadius)
                        .frame(height: cHeight)
                        .padding()
                    Image("someColoredPathPNGimage")
                }
            }
        }
    }
}


Solution

  • The navigationLink acts like Button and it gets the default button style with blue color.

    Using .renderingMode(.original) only works on Image views. What if you decide to load your image using some libs or pods?!

    It is better to change the default button style to plain using the modifier below:

    NavigationLink(destination: Text("Hello")) {
        ZStack {
            RoundedRectangle(cornerRadius: cRadius)
                .foregroundColor(.white)
                .opacity(0)
                .background(LinearGradient(gradient: Gradient(colors: [Color(red: 109/255, green: 58/255, blue: 242/255),Color(red: 57/255, green: 23/255, blue: 189/255)]), startPoint: .leading, endPoint: .trailing), cornerRadius: 0)
                .cornerRadius(cRadius)
                .frame(height: cHeight)
                .padding()
            Image("someColoredPathPNGimage")
        }
    }
    .buttonStyle(PlainButtonStyle())  // Here is what you need