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
At first, the x
inside of the symbol was the same color as background. I want it to make black.
backgroundColor
of the Button
and it made
whole Button
black. accentColor
of the Image
to
black. Nothing changed. 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?
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:
one more question though, it works but when I tap the button effect is working but there is a gray circle behind it and black parts fades to white more than it should do. Any suggestions on that?
Yeah. that's ugly. Sorry for missing out. I update my answer. Now the button should behave nicely when tapped
and the oscar goes to you. yet, how does this
compositonGroup()
works?@Faruk It treats subviews/modifiers as one before applying the modifier. in this case the views of
label
(= image, foreground, background and color)Altogether prolly still not the best solution. A better way could be to re-render the image filling all internally clear-color masked pixels with the color you want. But I didn't have the time to get into that.