Why the circle is cut off ??
When you apply an overlay to a view, the original view continues to
provide the layout characteristics for the resulting view.
Unfortunately, it is true even for .background() modifier!!
You need to change the frame of the button, especially on mac, where by default configuration the button's background is visible.
import SwiftUI
struct ContentView: View {
var body: some View {
Button(action: {
print("tap")
}) {
Text("Button").font(.largeTitle)
}.buttonStyle(BlueCircleButtonStyle())
// to see resulting layout bounds
.border(Color.red)
}
}
struct BlueCircleButtonStyle: ButtonStyle {
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label.padding().modifier(MakeSquareBounds()).background(Circle().fill(Color.blue))
}
}
struct MakeSquareBounds: ViewModifier {
@State var size: CGFloat = 1000
func body(content: Content) -> some View {
let c = ZStack {
content.alignmentGuide(HorizontalAlignment.center) { (vd) -> CGFloat in
DispatchQueue.main.async {
self.size = max(vd.height, vd.width)
}
return vd[HorizontalAlignment.center]
}
}
return c.frame(width: size, height: size)
}
}
the result running on mac

Tap on the blue to make an action ...
There is a way to style it different while pressed (check ButtonStyle properties)
PlainButtonStyleas in this post and customise button as you want.