Ios SwiftUI:将视图与其父视图的中心对齐

Ios SwiftUI:将视图与其父视图的中心对齐,ios,swift,swiftui,Ios,Swift,Swiftui,我在SwiftUI列表中显示了一组项目,如下所示: struct MissionCell\u预览:PreviewProvider{ 静态var任务:[任务]=[ 任务(名称:“卡西尼号”, 发射日期:“1997年10月15日”, 发射地点:“卡纳维拉尔角”, 任务日期:“2017年9月15日”, 状态:“过去”), 任务(名称:“星系演化探索者”, 发射日期:“04/28/03”, 发射地点:“卡纳维拉尔角”, 任务日期:“2013年6月28日”, 状态:“过去”), 任务(名称:“IRAS”,

我在SwiftUI列表中显示了一组项目,如下所示:

struct MissionCell\u预览:PreviewProvider{
静态var任务:[任务]=[
任务(名称:“卡西尼号”,
发射日期:“1997年10月15日”,
发射地点:“卡纳维拉尔角”,
任务日期:“2017年9月15日”,
状态:“过去”),
任务(名称:“星系演化探索者”,
发射日期:“04/28/03”,
发射地点:“卡纳维拉尔角”,
任务日期:“2013年6月28日”,
状态:“过去”),
任务(名称:“IRAS”,
发射日期:“01/25/83”,
发射地点:“范登堡”,
任务日期:“1983年11月21日”,
状态:无),
任务(名称:“努斯塔”,
发射日期:“2012年6月13日”,
发射地点:“中太平洋”,
任务日期:无,
状态:“当前”),
任务(名称:“旅行者1号”,
发射日期:“1977年5月9日”,
发射地点:“中太平洋”,
任务日期:无,
现状:无)
]
静态var预览:一些视图{
名单{
外交使团{驻阿富汗使团
任务单元(任务:任务)
}
}
}
}
我正在用以下代码创建一个单元格视图:

struct MissionCell:视图{
var任务:任务
var body:一些观点{
VStack(对齐:。任务可选信息对齐,间距:2){
文本(任务名称)
.lineLimit(1)
.truncationMode(.middle)
HStack(对齐:。顶部){
VStack(对齐:。前导){
HStack{
图像(系统名称:“日历”)
.foregroundColor(颜色(UIColor.systemGray))
文本(任务启动日期)
.foregroundColor(颜色(UIColor.systemGray))
}
HStack{
图像(系统名称:“location.fill”)
.foregroundColor(颜色(UIColor.systemGray))
文本(任务启动位置)
.foregroundColor(颜色(UIColor.systemGray))
}
}
VStack(对齐:。前导){
如果mission.missionEndate!=零{
HStack{
图像(systemName:“hand.凸起.slash.fill”)
.foregroundColor(颜色(UIColor.systemGray))
文本(mission.missionEndate!)
.foregroundColor(颜色(UIColor.systemGray))
}
}
如果任务状态!=无{
HStack{
图像(系统名称:“选中标记”)
.foregroundColor(颜色(UIColor.systemGray))
文本(mission.status???)
.foregroundColor(颜色(UIColor.systemGray))
}
}
}
}
}
.padding([.前导,.尾随],16)
}
}
我正试图实现两种对齐方式:

  • 对齐
    任务数据
    状态
    值。我使用堆栈对齐成功地实现了这一点
  • 将显示
    任务日期
    状态
    值的
    HStack
    对齐到
    任务单元
    视图的中心。我无法实现这一点。
    我尝试使用自定义对齐,但无法使用自定义对齐,因为没有任何东西可以对齐此
    HStack
    (即,我无法告诉它对齐到其父对象的中心)。下面是它当前的图像,看起来像:
  • 我曾考虑过使用
    GeometryReader
    获取顶级
    VStack
    的几何图形,但随后我丢失了所有间距信息,无法再使用对齐


    有没有一种方法可以在自定义视图树的深处对齐子视图,使其位于其父容器的中心?

    以下是Zstack的一种情况:

      struct  ListMissionView : View{
    
    
                        var missions: [Mission] = [
                            Mission(name: "Cassini",
                                    launchDate: "10/15/97",
                                    launchLocation: "Cape Canaveral",
                                    missionEndDate: "09/15/17",
                                    status: "Past"),
                            Mission(name: "Galaxy Evolution Explorer",
                                    launchDate: "04/28/03",
                                    launchLocation: "Cape Canaveral",
                                    missionEndDate: "06/28/13",
                                    status: "Past"),
                            Mission(name: "IRAS",
                                    launchDate: "01/25/83",
                                    launchLocation: "Vandenberg",
                                    missionEndDate: "11/21/83",
                                    status: nil),
                            Mission(name: "NuSTAR",
                                    launchDate: "06/13/12",
                                    launchLocation: "Central Pacific Ocean",
                                    missionEndDate: nil,
                                    status: "Current"),
                            Mission(name: "Voyager 1",
                                    launchDate: "09/05/77",
                                    launchLocation: "Central Pacific Ocean",
                                    missionEndDate: nil,
                                    status: nil)
                        ]
    
    
                            var body: some View {
                                GeometryReader{ proxy in
                          List {
                                ForEach(self.missions, id: \.name) { mission in
                                   MissionCell(mission: mission, proxy:  proxy)
                               }
                            }
                           }
                    }
                    }
    
    
                struct MissionCell: View {
                    var mission: Mission
    
                    var proxy: GeometryProxy
                    var body: some View {
    
                       // VStack(alignment: .missionOptionalInfoAlignment, spacing: 2) {
                        VStack(alignment: .leading, spacing: 2) {
                            Text(self.mission.name)
                                .lineLimit(1)
                                .truncationMode(.middle)
    
                            ZStack(alignment: .topLeading) {
    
                                VStack(alignment: .leading) {
                                    HStack {
                                        Image(systemName: "calendar")
                                            .foregroundColor(Color(UIColor.systemGray))
                                        Text(self.mission.launchDate)
                                            .foregroundColor(Color(UIColor.systemGray))
                                    }
                                    HStack {
                                        Image(systemName: "location.fill")
                                            .foregroundColor(Color(UIColor.systemGray))
                                        Text(self.mission.launchLocation)
                                            .foregroundColor(Color(UIColor.systemGray))
                                    }
    
                                }
    
                                VStack(alignment: .leading) {
    
                                    if self.mission.missionEndDate != nil {
                                        HStack {
                                            Image(systemName: "hand.raised.slash.fill")
                                                .foregroundColor(Color(UIColor.systemGray))
                                            Text(self.mission.missionEndDate!)
                                                .foregroundColor(Color(UIColor.systemGray))
                                        }
                                    }
                                    if self.mission.status != nil {
                                        HStack {
                                            Image(systemName: "checkmark")
                                                .foregroundColor(Color(UIColor.systemGray))
                                            Text(self.mission.status ?? "")
                                                .foregroundColor(Color(UIColor.systemGray))
    
                                        }
                                    }
                                }.alignmentGuide(.leading){ _ in return -self.proxy.size.width / 2.0}
                            }
                        }
                        .padding([.leading, .trailing], 16)
                        }
    
                }
    

    我建议你可以考虑使用ZStad,或者覆盖。是的,谢谢,现在我实际上是给覆盖层一个尝试,带有锚首选项。如果我能得到我想要的,我会发布一个答案。你也可以使用
    UIScreen.main.bounds.size.width
    设置列的宽度。这样你就不会丢失所有的间距信息。但是,如果旋转设备,它将不会自动更新。我没有考虑在
    列表中使用
    GeometryReader
    ,这是个好主意。谢谢