Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SwiftUI changing the color of clear part inside of SF Symbol

I am trying to change the color of clear(transparent) part inside of a SF Symbol called delete.left.fill. So far I've tried is as follows

Button(action: { return }, label: {
                        Image(systemName: "delete.left.fill")
                            .background(Color.black)
                            //.accentColor(.black)
                            .font(.system(size: self.fontSize*0.75))
                    })
                        .frame(width: self.width, height: self.width)
                        .foregroundColor(.lightGray)
                        //.background(Color.black)

When I run the code as above, the result is like

symbol.

At first, the xinside of the symbol was the same color as background. I want it to make black.

  1. I tried to set the backgroundColor of the Button and it made whole Button black.
  2. I tried to set accentColor of the Image to black. Nothing changed.
  3. I tried to set backgroundColor of the Image to black. The result can be seen in the image.

The question is, is there a way to make just that x, inside the symbol, black programmatically?

like image 951
Faruk Avatar asked Feb 01 '20 00:02

Faruk


2 Answers

You could mask the background and apply a custom style:

struct MyButtonStyle: ButtonStyle {
  public func makeBody(configuration: MyButtonStyle.Configuration) -> some View {
    configuration.label
      .compositingGroup()
      .opacity(configuration.isPressed ? 0.5 : 1.0)
  }
}

Button(action: {}) {
  Image(systemName: "delete.left.fill")
    .foregroundColor(.green)
    .background(
      Color.black.mask(Circle())
    )
}.buttonStyle(MyButtonStyle())

The circle may not fit to any usage, but for this image it works okay:

enter image description here

like image 179
nine stones Avatar answered Oct 12 '22 11:10

nine stones


As he warned with the circle, @Faruk's solution didn't work for me with the exclamationmark.triangle.fill

I created a ZStack with the fill and unfill versions to create a yellow triangle with a black exclamation point and a black border:

ZStack{
  Image(systemName: "exclamationmark.triangle")
    .foregroundColor(Color.black)
    .scaleEffect(1.1)
  Image(systemName: "exclamationmark.triangle.fill")
    .foregroundColor(Color.yellow)
}

I've only tried on couple of simulators, but it looks nice on iPadPro and iPad Mini

like image 20
Daniel Price Avatar answered Oct 12 '22 13:10

Daniel Price