Просто чтобы немного глубже разобраться в этом вопросе (пожалуйста, учтите, что ответ @ Mycroft правильный ): для того, чтобы пользовательский интерфейс показывался в вопросе, необходимо Spacer
, это не так. по желанию. Я создал минимальный жизнеспособный пример, чтобы точно показать, что произойдет без представления Spacer
:
struct ContentView: View {
var body: some View {
VStack {
HStack {
Image(systemName: "magnifyingglass")
.foregroundColor(Color(.systemOrange))
VStack(alignment: .leading) {
Text("Sed ut perspiciatis unde omnis iste natus")
}
}
HStack {
Image(systemName: "magnifyingglass")
.foregroundColor(Color(.systemOrange))
VStack(alignment: .leading) {
Text("Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.")
}
}
HStack {
Image(systemName: "magnifyingglass")
.foregroundColor(Color(.systemOrange))
VStack(alignment: .leading) {
Text("At vero eos ")
}
}
}
}
}
Результат:

Как видите, результат полностью смещен. Таким образом, вы должны добавить представление Spacer
, чтобы получить желаемое выравнивание.
struct ContentView: View {
var body: some View {
VStack {
HStack {
Image(systemName: "magnifyingglass")
.foregroundColor(Color(.systemOrange))
VStack(alignment: .leading) {
Text("Sed ut perspiciatis unde omnis iste natus")
}
Spacer()
}
HStack {
Image(systemName: "magnifyingglass")
.foregroundColor(Color(.systemOrange))
VStack(alignment: .leading) {
Text("Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.")
}
Spacer()
}
HStack {
Image(systemName: "magnifyingglass")
.foregroundColor(Color(.systemOrange))
VStack(alignment: .leading) {
Text("At vero eos ")
}
Spacer()
}
}
}
}

В макете выше у вас есть "две колонки ", левая с изображениями и правая с текстами. Если вы не укажете размер, система размещения разместит изображения, а затем предоставит оставшееся пространство для текстов. Но есть и другой вариант, если вам нужно указать конкретные размеры: если вам нужно, чтобы левый столбец изображения составлял, например, половину экрана, вы можете использовать GeometryReader
:
struct ContentView: View {
var body: some View {
GeometryReader { g in
VStack {
HStack {
HStack {
Spacer()
Image(systemName: "magnifyingglass")
.foregroundColor(Color(.systemOrange))
}
.frame(width: g.size.width/2.0)
VStack(alignment: .leading) {
Text("Sed ut perspiciatis unde omnis iste natus")
}
Spacer()
}
HStack {
HStack {
Spacer()
Image(systemName: "magnifyingglass")
.foregroundColor(Color(.systemOrange))
}
.frame(width: g.size.width/2.0)
VStack(alignment: .leading) {
Text("Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Sed ut ")
}
Spacer()
}
HStack {
HStack {
Spacer()
Image(systemName: "magnifyingglass")
.foregroundColor(Color(.systemOrange))
}
.frame(width: g.size.width/2.0)
VStack(alignment: .leading) {
Text("At vero eos ")
}
Spacer()
}
}
}
}
}
