Home > Blockchain >  Swiftui Background (Material vs systemColor)
Swiftui Background (Material vs systemColor)

Time:02-01

Can someone tell me why those are working:

.background(.regularMaterial)
.background(Color(.systemGray5))

But it's not working like this?

.background(colorScheme == .dark ? .regularMaterial : Color(.systemGray5))

CodePudding user response:

There is an overload of background that takes a ShapeStyle, which both Material.regularMaterial and Color conform to.

However, the problem is that the 2 sides of the ternary operator must always have the same type - you cannot have Material on one side and Color on the other side, even though both conform to the same protocol.

You can however create your own @ViewBuilder method, which conditionally calls background with the appropriate value. This way you are always calling background with a concrete type.

extension View {
  @ViewBuilder
  func myBackground(colorScheme: ColorScheme) -> some View {
    if colorScheme == .dark {
      background(.regularMaterial)
    } else {
      background(Color(.systemGray))
    }
  }
}

Then just call myBackground in your View.

struct ViewWithBackground: View {
  @Environment var colorScheme: ColorScheme

  var body: some View {
    Text("Body")
      .myBackground(colorScheme: colorScheme)
  }
}
  • Related