swiftui - ScrollView 文本对齐 SwiftUI
问题描述
我有一个垂直ScrollView
的ForEach
循环,HStack
里面有Text
,Image
和 Two Text
。我想保持每一行的项目彼此对齐。我试图用VStack
withalignment .leading
但什么也没做。我遇到的问题是文本没有对齐。对 SwiftUI 来说仍然很新,因此我们将不胜感激。
ScrollView(.vertical) {
ForEach(self.daily.forecast, id: \.date) { forecast in
HStack (spacing : 10){
Text(forecast.date ?? "")
.fontWeight(.bold)
Spacer()
RequestImage(Url("IMAGE_URL"))
.aspectRatio(contentMode: .fit)
.frame(width: 30, height: 30)
.clipped()
Spacer()
Text("\(forecast.maxTemp)")
.fontWeight(.bold)
Text("\(forecast.minTemp)")
.fontWeight(.bold)
}
}
}
.padding(.all, 15)
.onAppear() {
authorize {_ in
loadForecast()
}
}
更新:我能够更接近一点,但事情仍然与我希望它们的位置不一致。
ScrollView(.vertical) {
ForEach(self.daily.forecast, id: \.date) { forecast in
HStack (spacing : 10){
Text(date)
.font(.title3)
.fontWeight(.bold)
.frame(minWidth: 45)
Spacer()
RequestImage(Url("IMAGE_URL"))
.aspectRatio(contentMode: .fit)
.frame(width: 35, height: 35)
.frame(minWidth: 50)
.clipped()
Spacer()
Text(maxTemp)
.font(.title3)
.fontWeight(.bold)
.frame(minWidth: 45)
Text(minTemp)
.font(.title3)
.fontWeight(.bold)
.foregroundColor(Color.secondary)
.frame(minWidth: 45)
}
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
}
}
.padding(.all, 15)
.onAppear() {
authorize {_ in
loadForecast()
}
}
解决方案
这是可能解决方案的演示。使用 Xcode 12.4 / iOS 14.4 准备
struct DemoWeatherLayout: View {
private var dayOfTheWeek = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sut"]
var body: some View {
ScrollView {
VStack {
ForEach(dayOfTheWeek, id: \.self) {
WeatherRowView(day: $0,
icon: ["sun.max", "cloud.sun", "cloud", "cloud.snow"].randomElement()!,
low: Array(-5..<0).randomElement()!,
high: Array(1..<15).randomElement()!)
}
}.padding()
}
}
}
struct WeatherRowView: View {
var day: String
var icon: String
var low: Int
var high: Int
var body: some View {
HStack {
Text(day)
.frame(maxWidth: .infinity, alignment: .leading)
Image(systemName: icon)
.frame(maxWidth: .infinity, alignment: .leading)
HStack {
Text("+XXº").foregroundColor(.clear)
.overlay(Text(String(format: "%+d", low)), alignment: .leading)
Text("+XXº").foregroundColor(.clear)
.overlay(Text(String(format: "%+d", high)), alignment: .leading)
}
}
}
}
推荐阅读
- javascript - 如何使用 jQuery 将活动类添加到菜单和子菜单项
- python - 'int' 对象在 3d 数组中不是可下标的错误
- swift - 关于保存 gata NSUnknownKeyException 的 Swift 中的 Core Dara 错误
- grafana - InfluxDB 经过时间基于特定值
- python - Keras 模型:RL 代理的输入形状尺寸误差
- python - 为什么在 Anaconda 提示符下运行“Jupyter notebook”命令会出现属性错误?
- postgresql - 将查询结果用于 SELECT 列表
- python - 根据 pandas 数据框中的列表排除日期
- android - 了解 adb logcat 以及如何从示例中过滤
- javascript - 从对象中省略扩展数组