Здесь возможен подход, основанный на направляющих выравнивания. Протестировано с Xcode 11.4 / iOS 13.4
Идея состоит в том, чтобы использовать полосы и текст на разных слоях и выравнивать их с помощью пользовательского руководства по выравниванию, с обработкой угловых случаев, чтобы текст не выпадал из экрана.

extension HorizontalAlignment {
private enum MonthAlignment : AlignmentID {
static func defaultValue(in d: ViewDimensions) -> CGFloat {
return d[HorizontalAlignment.center]
}
}
static let monthAlignment = HorizontalAlignment(MonthAlignment.self)
}
struct DemoMonthAlignment: View {
let months = ["january" , "februarry", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"]
@State private var selectedMonth = "october"
var body: some View {
VStack(alignment: .monthAlignment, spacing: 2) {
Text(selectedMonth)
.alignmentGuide(.monthAlignment, computeValue: { d in
if self.selectedMonth == self.months.first {
return d[.leading]
} else if self.selectedMonth == self.months.last {
return d[.trailing]
} else {
return d[HorizontalAlignment.center]
}
})
HStack {
ForEach(months, id: \.self) { month in
Group {
if month == self.selectedMonth {
Rectangle()
.foregroundColor(Color.red)
.alignmentGuide(.monthAlignment, computeValue: { d in
if month == self.months.first {
return d[.leading]
} else if month == self.months.last {
return d[.trailing]
} else {
return d[HorizontalAlignment.center]
}
})
} else {
Rectangle()
}
}
.frame(width: 25, height: 10)
}
}
}
}
}