ios - SwiftUI:将 View 与其父 View 的中心对齐

标签 ios swift swiftui

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

struct MissionCell_Previews: PreviewProvider {
    static 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)
    ]

    static var previews: some View {
        List {
            ForEach(missions) { mission in
                MissionCell(mission: mission)
            }
        }
    }
}

我正在使用以下代码创建一个单元格 View :

struct MissionCell: View {
    var mission: Mission

    var body: some View {
        VStack(alignment: .missionOptionalInfoAlignment, spacing: 2) {
            Text(mission.name)
                .lineLimit(1)
                .truncationMode(.middle)
            HStack(alignment: .top) {
                VStack(alignment: .leading) {
                    HStack {
                        Image(systemName: "calendar")
                            .foregroundColor(Color(UIColor.systemGray))
                        Text(mission.launchDate)
                            .foregroundColor(Color(UIColor.systemGray))
                    }
                    HStack {
                        Image(systemName: "location.fill")
                            .foregroundColor(Color(UIColor.systemGray))
                        Text(mission.launchLocation)
                            .foregroundColor(Color(UIColor.systemGray))
                    }

                }
                VStack(alignment: .leading) {
                    if mission.missionEndDate != nil {
                        HStack {
                            Image(systemName: "hand.raised.slash.fill")
                                .foregroundColor(Color(UIColor.systemGray))
                            Text(mission.missionEndDate!)
                                .foregroundColor(Color(UIColor.systemGray))
                        }
                    }
                    if mission.status != nil {
                        HStack {
                            Image(systemName: "checkmark")
                                .foregroundColor(Color(UIColor.systemGray))
                            Text(mission.status ?? "")
                                .foregroundColor(Color(UIColor.systemGray))
                        }
                    }
                }
            }
        }
        .padding([.leading, .trailing], 16)
    }
}

我正在努力实现 2 种对齐方式:

  1. missionEndDatestatus 值的对齐方式。我使用堆栈对齐成功实现了这一目标。
  2. 将显示 missionEndDatestatus 值的 HStackMissionCell 的中心对齐> 查看。我无法做到这一点。我尝试使用自定义对齐方式,但我无法使用自定义对齐方式来做到这一点,因为没有任何东西可以将此 HStack 与(即我无法告诉它对齐)对齐到它的父中心)。这是它目前的图像: Image showing incomplete alignment

我曾考虑过使用 GeometryReader 获取顶层 VStack 的几何形状,但后来我丢失了所有间距信息并且无法再使用对齐方式.

有没有办法将 subview 在自定义 View 树的深处对齐,使其位于其父容器的中心?

最佳答案

这是 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)
                    }

            }

关于ios - SwiftUI:将 View 与其父 View 的中心对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59146350/

相关文章:

ios - 如何使用 Swift 5 在 SwiftUI 中使用具有 RGB 或十六进制值的颜色?

ios - 响应式导航栏字体大小适用于 PC,但不适用于 iPhone

ios - Xcode - 使用约束来放置不完全水平居中的项目

ios - 大型 JSON 文件 Swift

ios - 我无法快速将数组写入 NSUserDefaults

ios - 如何使用 SwiftUI 创建自定义 slider ?

ios - 无法让应用程序图标在 Xcode 6 中工作

ios - 在 swift 项目中使用 Wordpress ios 编辑器(用 objective-c 编写)

ios - 从iOS中的C函数内部生成带有Swift入口点的生成线程

swift - 在 SwiftUI 中,如何以高性能绘制阴影?