Попробуйте разделить ваш вид на три столбца с фиксированной шириной 30% ширины экрана. Сначала вы должны обернуть ваш родительский вид с GeometryReader , который даст вам размеры экрана, затем передать ширину дочернему представлению, установить кадр для каждого HStack, который будет представлять ваши столбцы, и, наконец, установить пропорциональна ширине. Вот пример, основанный на вашем коде.
Child View
struct MatchSet: Hashable {
var pointsPlayer1: Int
var pointsPlayer2: Int
}
struct Match: Hashable {
var sets: [MatchSet]
var currentSet: MatchSet
var player1Name: String
var player2Name: String
var setsWon1: Int
var setsWon2: Int
}
struct MatchView: View {
let parentViewWidth: CGFloat
var match: Match
var body: some View {
VStack{
HStack{
HStack{
Text(self.match.player1Name).lineLimit(1)
if self.match.setsWon1 == 2{
Text("?")
}else{
Text("")
}
}.frame(width: parentViewWidth * 0.3)
HStack{
Text(String(self.match.setsWon1))
Text(" - ")
Text(String(self.match.setsWon2))
}.frame(width: parentViewWidth * 0.3)
HStack {
if self.match.setsWon2 == 2{
Text("?")
}else{
Text("")
}
Text(self.match.player2Name).lineLimit(1)
}.frame(width: parentViewWidth * 0.3)
}
ForEach(self.match.sets, id: \.self){set in
HStack{
Text(String(set.pointsPlayer1))
Text(" - ")
Text(String(set.pointsPlayer2))
}
}
}
}
}
Parent View
//...
var body: some View {
GeometryReader { metrics in
VStack {
ForEach(self.matches, id: \.self) { match in
MatchView(parentViewWidth: metrics.size.width, match: match)
}
Spacer()
}
}
}