gpt4 book ai didi

不使用垫片定位 View 底部

转载 作者:行者123 更新时间:2023-12-03 23:50:09 29 4
gpt4 key购买 nike

如何在不使用垫片的情况下将 View 定位在底部。我知道我可以在 VStack 中放置一个间隔器和我的 View 来实现它,但我不想使用一个间隔器,因为我不希望我的 View 占据所有的垂直空间。使用 UIKit,我会将其放置在安全区域底部指南中。

最佳答案

尝试不同的方法,我最终创建了自己的自定义容器,它有一些已知的限制,完全满足我的需求。希望对其他人有帮助。

演示:

PinnedView Demo1

优点:ContentView 和 PinnedView 在布局上绝对独立,自动处理设备方向,内部内容实际上是无限的

缺点:由于使用 GeometryReader使用 .infinity由于“鸡-蛋”问题,在顶级内容或固定 View 中会导致崩溃。

容器代码:

struct ContainerWithPinnedBottomView<Content, Pinned>: View 
where Content: View, Pinned: View {

private var content: () -> Content
private var bottomView: () -> Pinned

@inlinable public init(@ViewBuilder pinnedView: @escaping () -> Pinned,
@ViewBuilder content: @escaping () -> Content) {
self.content = content
self.bottomView = pinnedView
}

var body: some View {
ZStack(alignment: .bottom) {
Rectangle().fill(Color.clear) // !! Extends ZStack to full screen
GeometryReader { _ in
ZStack {
self.content()
}
}
self.bottomView()
.alignmentGuide(.bottom) { $0[.bottom] }
}
}

}

使用示例(演示截图)
struct TestBottomView: View {
var body: some View {
ContainerWithPinnedBottomView(pinnedView: {
HStack {
Spacer()
Text("Always Pinned to Bottom")
.padding()
// .frame(width: .infinity) // !! LIMITATION - don't use, cycling crash
Spacer()
}
.background(Color.blue)
}) {
NavigationView {
List (0 ..< 100, id: \.self) { i in
NavigationLink(destination: Text("Other")) {
Text("Row \(i)")
}
}
.navigationBarTitle("TitleBar")
}
}
}
}

struct TestBottomView_Previews: PreviewProvider {
static var previews: some View {
TestBottomView()
}
}

关于不使用垫片定位 View 底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59165138/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com