Swiftui 无法在横向中将列表宽度设置为0
我正试着用列表做滑动侧面板。问题是,在使用safearea guide的设备上,我无法在横向方向将列表宽度设置为0Swiftui 无法在横向中将列表宽度设置为0,swiftui,Swiftui,我正试着用列表做滑动侧面板。问题是,在使用safearea guide的设备上,我无法在横向方向将列表宽度设置为0 struct ContentView: View { var body: some View { HStack { Spacer() List { Text("1") Text("2") } .frame(width:0) } .backgro
struct ContentView: View {
var body: some View {
HStack {
Spacer()
List {
Text("1")
Text("2")
}
.frame(width:0)
}
.background(Color.green)
}
}
在纵向模式下,它看起来像:
在景观方面:
你知道如何完全隐藏列表吗
在没有安全区域的设备上,一切正常,没有问题
我发现解决办法是增加
Rectangle().frame(width: 0)
对于同一个HStack,则列表在所有条件下都不会显示,但这看起来很奇怪
6月10日起更新:
我一直在与苹果DTS团队讨论这个问题,他们确认,我发现一个系统错误,现在通过FB7729714报告给工程团队。
另一方面,他们告诉我设置视图的宽度会导致子视图的重新显示,所以设置为0就更复杂了。因此,建议您在滑动视图等情况下使用位置和偏移。我不确定您的代码到底是什么样子,因为您没有提供更多信息,但以下是如何在SwiftUI中实现滑动菜单,而无需额外的修改 使用GeometryReader、偏移和动画过渡显示/隐藏侧面板:
struct ContentView: View {
@State var showMenu = false
var body: some View {
NavigationView {
GeometryReader { geometry in
ZStack(alignment: .leading) {
MainView(showMenu: self.$showMenu)
.frame(width: geometry.size.width, height: geometry.size.height)
.offset(x: self.showMenu ? geometry.size.width : 0)
.disabled(self.showMenu ? true : false)
if self.showMenu {
MenuView()
.frame(width: geometry.size.width)
.transition(.move(edge: .leading))
}
}
}
.background(Color.red)
.navigationBarTitle("Side Menu", displayMode: .inline)
.navigationBarItems(leading: (
Button(action: {
withAnimation {
self.showMenu.toggle()
}
}) {
Image(systemName: "line.horizontal.3")
.imageScale(.large)
}
))
}
}
}
有关此代码的完整说明,请参见本教程:
您还可以尝试将其添加到视图中,以填充整个屏幕:
.edgesIgnoringSafeArea()
在Xcode 11.5中测试。滑块完全从屏幕上消失-我希望这是您想要实现的。您到底想实现什么?为什么列表必须在屏幕上可见?@pawello2222,正如我在开头所写的,在我的应用程序中,我有一个侧面板,可以通过按下控制按钮从右侧滑出或滑入来关闭或打开。一切都很顺利。但在测试过程中,我发现在类似iPhoneX的设备上,在横向模式下,侧面板并没有完全隐藏,无论我做什么,它都会留在屏幕上。只有当列表位于面板内部时,才会出现问题。有趣的是,如果我将Rectangle.framewidth:0添加到同一个HStack中,侧面板会很好地关闭。如果我将间距添加到间距:0{…-同样,该列表是不可考虑的
struct MenuView: View {
var body: some View {
List {
Text("Item 1")
Text("Item 2")
Spacer()
}
.background(Color.green)
.padding()
.frame(maxWidth: .infinity, alignment: .leading)
}
}
.edgesIgnoringSafeArea()