SwiftUI:固定到居中元素的顶部和底部

Jos*_*osh 5 ios swift swiftui

使用 SwiftUI,我试图将 aView在屏幕上居中,然后给它一个可变高度的页眉和/或页脚。

使用约束,它看起来像这样:

let view = ...
let header = ...
let footer = ...

view.centerInParent()
header.pinBottomToTop(of: view)
footer.pinTopToBottom(of: view)
Run Code Online (Sandbox Code Playgroud)

这样view,无论页眉和页脚的大小如何,都将始终位于屏幕中央。

我不知道如何用 SwiftUI 来完成这个。使用任何类型的HStackVStack意味着 的大小headerfooter推动view。我想避免硬编码任何高度,因为中心的view大小也可能不同。

有任何想法吗?SwiftUI 的新手,因此非常感谢您的建议!

Asp*_*eri 3

如果我正确理解了你的目标(因为,正如 @nayem 评论的那样,我第一次似乎错过了),以下方法应该会有所帮助。

SwiftUI 页眉和页脚

代码快照:

extension VerticalAlignment {
   private enum CenteredMiddleView: AlignmentID {
      static func defaultValue(in dimensions: ViewDimensions) -> CGFloat {
         return dimensions[VerticalAlignment.center]
      }
   }

    static let centeredMiddleView = VerticalAlignment(CenteredMiddleView.self)
}

extension Alignment {
    static let centeredView = Alignment(horizontal: HorizontalAlignment.center, 
                          vertical: VerticalAlignment.centeredMiddleView)
}

struct TestHeaderFooter: View {
    var body: some View {
        ZStack(alignment: .centeredView) {
            Rectangle().fill(Color.clear) // !! Extends ZStack to full screen
            VStack {
                Header()
                Text("I'm on center")
                    .alignmentGuide(.centeredMiddleView) { 
                         $0[VerticalAlignment.center]
                    }
                Footer()
            }
        }
//        .edgesIgnoringSafeArea(.top) // uncomment if needed
    }
}

struct Header: View {
    var body: some View {
        Rectangle()
            .fill(Color.blue)
            .frame(height: 40)
    }
}

struct Footer: View {
    var body: some View {
        Rectangle()
            .fill(Color.green)
            .frame(height: 200)
    }
}

struct SwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        TestHeaderFooter()
    }
}
Run Code Online (Sandbox Code Playgroud)