我不知道如何对齐此视图的内容:
我尝试了许多不同的方法:
似乎没有任何效果:(
import SwiftUI
struct Welcome: View {
var body: some View {
VStack {
Text("Welcome to XXX")
.font(.title).bold()
HStack {
Image(systemName: "magnifyingglass")
.foregroundColor(Color(.systemOrange))
.imageScale(.large)
.padding()
VStack(alignment: .leading) {
Text("Lorem ipsum dolor")
.font(.headline)
Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore")
.font(.subheadline)
.foregroundColor(Color(.lightText))
}
}.padding()
HStack {
Image(systemName: "command")
.foregroundColor(Color(.systemOrange))
.imageScale(.large)
.padding()
VStack(alignment: .leading) {
Text("Lorem ipsum dolor")
.font(.headline)
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.")
.font(.subheadline)
.foregroundColor(Color(.lightText))
}
}.padding()
HStack {
Image(systemName: "cube")
.foregroundColor(Color(.systemOrange))
.imageScale(.large)
.padding()
VStack(alignment: .leading) {
Text("At vero eos et accusamus")
.font(.headline)
Text("At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque ")
.font(.subheadline)
.foregroundColor(Color(.lightText))
}
}.padding()
Button(action: {
print("skip")
}) {
HStack {
Spacer()
Text("Skip")
.font(.subheadline)
Spacer()
}
.foregroundColor(Color(.systemOrange))
}.padding(.top, 60)
Button(action: {
print("continue")
}) {
HStack {
Spacer()
Text("Sign In")
.font(.subheadline)
Spacer()
}
.padding(12)
.foregroundColor(Color(.label))
.background(Color(.systemOrange))
.cornerRadius(12)
}.padding()
}
}
}
非常令人讨厌的是,《人机界面指南》建议创建这样的欢迎屏幕,但它们并没有提供简单的方法。
答案 0 :(得分:3)
添加间隔符似乎可以解决问题:
HStack {
Image(systemName: "cube")
.foregroundColor(Color(.systemOrange))
.imageScale(.large)
.padding()
VStack(alignment: .leading) {
Text("At vero eos et accusamus")
.font(.headline)
Text("At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque ")
.font(.subheadline)
.foregroundColor(Color(.lightText))
}
Spacer()
}.padding()
答案 1 :(得分:2)
仅需对此问题进行更深入的了解(请考虑@Mycroft的回答是正确的):为了使问题中显示的UI,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()
}
}
}
}
}