In Apple SwiftUI Tutorial: Drawing paths and shapes,after completing Section 2 Step 8, the two top and bottom corners are cut off from the badge. The shape is perfectly normal until adding the gradient (Section 2 Step 8), but then the corners are cut off.
This is my code, which I double-checked with the tutorial:
import SwiftUI
struct BadgeBackground: View {
var body: some View {
GeometryReader { geometry in
Path { path in
var width: CGFloat = min(geometry.size.width, geometry.size.height)
let height = width
let xScale: CGFloat = 0.832
let xOffset = (width * (1.0 - xScale)) / 2.0
width *= xScale
path.move(
to: CGPoint(
x: width * 0.95 + xOffset,
y: height * (0.20 + HexagonParameters.adjustment)
)
)
HexagonParameters.segments.forEach { segment in
path.addLine(
to: CGPoint(
x: width * segment.line.x + xOffset,
y: height * segment.line.y
)
)
path.addQuadCurve(
to: CGPoint(
x: width * segment.curve.x + xOffset,
y: height * segment.curve.y
),
control: CGPoint(
x: width * segment.control.x + xOffset,
y: height * segment.control.y
)
)
}
}
.fill(.linearGradient(
Gradient(colors: [Self.gradientStart, Self.gradientEnd]),
startPoint: UnitPoint(x: 0.5, y: 0),
endPoint: UnitPoint(x: 0.5, y: 0.6)
))
}
.aspectRatio(1, contentMode: .fit)
}
static let gradientStart = Color(red: 239.0 / 255, green: 120.0 / 255, blue: 221.0 / 255)
static let gradientEnd = Color(red: 239.0 / 255, green: 172.0 / 255, blue: 120.0 / 255)
}
#Preview {
BadgeBackground()
}
After completing Section 2, I noticed that the corners were missing. I retraced my steps and discovered that the corners only got cut off when I add the gradient in Step 8.
2
Answers
It gets interesting if you add an additional
.fill()
statement before the linear gradient:This is what you see:
A possible explanation is as follows:
(x: 0.5, y: 0)
, which is the center of the top edge, and goes to(x: 0.5, y: 0.6)
, which is 6/10 of the height.→ So this would seem to be a bug.
If you are interested in a workaround, you could use the solid-fill form as a
.mask
over aLinearGradient
. However, even here it is necessary to add.geometryGroup()
to the filled form, otherwise the same error is seen.Use below code, it is working perfectly and drawing smooth shape as per your requirements without any top or bottom area cut.
Result: