How to make a ScrollView align to left side of frame?

23 Views Asked by At

For the sake of practicing, am trying to make a Worlde type app, nothing original.

I would like to make it so that the ScrollView, the list of words at the top of the VStack, is aligned to the left side of the screen. Even tried embedding it its own VStack with an alignment of .leading, but obviously to no avail.

Is there any alignment option I can use, or must I go to GeometeryReader for something like this?

import SwiftUI

struct ContentView: View {
    @EnvironmentObject var word : Word
    
    var body: some View {
        ZStack {
            VStack {
                VStack(alignment: .leading) {
                    ScrollView{
                        if word.guessedWords.count > 0 {
                            
                            ForEach(0..<word.guessedWords.count, id: \.self) { count in
                                HStack {
                                    Text(word.guessedWords[count])
                                        .foregroundColor(.white)
                                        .padding(.trailing, 10)
                                    Text("\(count)")
                                        .foregroundColor(.white)
                                }
                            }
                        }
                    }
                    .padding(.top, 75)
                }
                
                Spacer()
                
                GuessedLetters()
                
                Keyboard()
                    .padding(.bottom)
                
            }
        }
        .background(.black)
        .ignoresSafeArea()
    }
    
}

#Preview {
    ContentView()
        .environmentObject(Word())
}

enter image description here

1

There are 1 best solutions below

0
Benzy Neez On BEST ANSWER

The alignment given to the VStack determines how multiple views inside the VStack are aligned to each other, when they have different widths. However, if the VStack only contains one subview (this being the ScrollView), it has no effect.

Here are three possible ways to fix:

1. Set a frame with maxWidth: .infinity and alignment: .leading on the ScrollView

ScrollView {
    // ...
}
.padding(.top, 75)
.frame(maxWidth: .infinity, alignment: .leading) // <- ADDED

This will push the contents of the ScrollView to the left, but the rows themselves will not be left aligned.

2. Add a Spacer to the HStack inside the ScrollView

This pushes the content to the left and the content will also be left aligned:

ScrollView {
    // ...
            HStack {
                Text(word.guessedWords[count])
                    .foregroundColor(.white)
                    .padding(.trailing, 10)
                Text("\(count)")
                    .foregroundColor(.white)
                Spacer() // <- ADDED
            }
     // ...
}

3. Use a nested VStack inside the ScrollView

This is where alignment: .leading will now be useful. You can also push it all to the left side using maxWidth: .infinity, as for variant 1:

ScrollView {
    if word.guessedWords.count > 0 {
        VStack(alignment: .leading) {
            ForEach(0..<word.guessedWords.count, id: \.self) { count in
                // ...
            }
        }
        .frame(maxWidth: .infinity, alignment: .leading)
    }
}