Ios SwiftUI:将视图与其父视图的中心对齐
我在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”,
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
,这是个好主意。谢谢