6

I've been building an application in SwiftUI recently and today I'm noticing that the VStack Alignment is having some strange behavior. No matter the alignment I use, the view isn't aligning outside of the center. See below:

VStack(alignment: .trailing, spacing: 0) {
    Text("Hello, World!")
}

enter image description here

VStack(alignment: .center, spacing: 0) {
    Text("Hello, World!")
}

sw

It's doing this in both the preview and the simulator, I'm trying to align my text to the right edge of the screen.

Full Code:

import SwiftUI

struct DemoView: View {
    var body: some View {
        VStack(alignment: .center, spacing: 0) {
            Text("Hello, World!")
        }
    }
}

struct DemoView_Previews: PreviewProvider {
    static var previews: some View {
        DemoView()
    }

}
pawello2222
  • 46,897
  • 22
  • 145
  • 209
Jack
  • 304
  • 6
  • 19

2 Answers2

19

The VStack(alignment:...) is for aligning subviews, but you have only one subview, so nothing to align

By default all stacks are tight to content (just add .border to your test VStack/s and you see the result, so there is no area to move content.

What you expected is solved by giving frame alignment in stack providing screen-wide area:

demo

VStack {
    Text("Hello, World!")
}.frame(maxWidth: .infinity, alignment: .trailing)

P.S. SwiftUI still has many bugs, but not here :)

Asperi
  • 228,894
  • 20
  • 464
  • 690
6

I agree with the author, the behavior is strange...at least. Alignment for VStack subviews does not work in case:

VStack(alignment: .leading) {
    Text("Hello, world!")
    Text("Hello, world!")
}
.frame(width: 200, height: 200)

but works in case:

VStack {
    Text("Hello, world!")
    Text("Hello, world!")
}
.frame(width: 200, height: 200, alignment: .leading)

If this is not a bug then definitively a poor realisation of the "declarative" approach.

Andrey Popov
  • 61
  • 1
  • 1