Home > OS >  SwiftUI on Mac: Help Text Always Visible Even within View with Zero Opacity
SwiftUI on Mac: Help Text Always Visible Even within View with Zero Opacity

Time:12-03

I have run into some unexpected behavior while using SwiftUI in a macOS app. I filed a Feedback with Apple in case it's a bug, but it might actually be designed to work this way, so I'm looking for a workaround.

I rely heavily on the use of .opacity() to show and hide different sections of my app with tabs. I don't use if clauses because each time the user changes the tab, you have to wait for the entire view to rebuild and that is pretty slow.

Here's a basic example that demonstrates the problem:

struct ContentView: View {
  @State var viewAVisible = false
  
  var body: some View {
    VStack{
      ZStack{
    
        Text("View A Visible")
          .frame(width: 500, height: 500)
          .background(Color.blue)
          .help("This is View A's help text. It should be invisible when View A is invisible.")
          .opacity(viewAVisible ? 1 : 0)
        
        Text("View B Visible")
          .frame(width: 500, height: 500)
          .background(Color.gray)
          .opacity(viewAVisible ? 0 : 1)
      }
    
      Button("Toggle"){
        viewAVisible.toggle()
      }
     
    }.padding()
  }
}

The default app state is to hide the "View A" Text() and only show the "View B" Text(). But if you hover over View B, you still see View A's .help text:

enter image description here

In my opinion, if a view has .opacity(0) then its help text shouldn't show up. But regardless, I need to find a way around this.

I thought about doing something like this:

.help(viewAVisible ? "This is View A's help text..." : "")

...but that doesn't scale across dozens of views in my app--particularly among child views that don't know if their parent view is shown or hidden. As I mouse across my app, I see the help text of tons of views all over the place even though they are invisible.

  • Related