无法在 SwiftUI 中通过 HStack 显示下拉菜单

Can't show dropdown menu over HStack in SwiftUI

我有一个列表项需要一个下拉菜单,该菜单显示在 HStack 中其他视图的顶部。

这是我目前拥有的:

struct ListRow: View {
    @Binding var item: Item
    @State var showDropdown: Bool = false
    var body: some View {
        ZStack {
            HStack {
                VStack {
                    Text(item.name)
                        .fixedSize(horizontal: false, vertical: true)
                        .frame(maxWidth: .infinity, alignment: .topLeading)
                    ProgressView(value: item.percentDone)
                }.padding(.all, 10)
                Button(action: {
                    self.showDropdown.toggle()
                }, label: {
                    Image(systemName: "ellipsis.circle")
                }).buttonStyle(BorderlessButtonStyle())
                    .overlay (
                        VStack {
                            if self.showDropdown {
                                Spacer(minLength: 40)
                                Text("TEST")
                                    .onTapGesture {
                                        print("Delete")
                                    }
                            }
                        }.zIndex(10)
                    )
            }
        }
    }
}

但是当我 运行 它并单击按钮时,这就是我看到的

看起来 Text 没有显示,因为视图 ​​overflow/overlap 与 HStack 的其余部分,但我认为添加 .zIndex 会将下拉列表放在顶部ZStack

中的其余观点

我想出了一个更好的解决方案。

struct ListRow: View {
    @Binding var item: Item
    var body: some View {
        HStack {
            VStack {
                Text(item.name)
                    .fixedSize(horizontal: false, vertical: true)
                    .frame(maxWidth: .infinity, alignment: .topLeading)
                ProgressView(value: item.percentDone)
            }.padding(.all, 10)
            Menu {
                Button("Delete", action: {
                    print("Delete")
                })
            } label: {
                
            }
            .menuStyle(BorderlessButtonMenuStyle())
            .frame(width: 10, height: 10, alignment: .center)
        }
    }
}

只需为您的 overlay view 设置 frame 使其超过其主视图的大小

.overlay (
    VStack {
        if self.showDropdown {
            Spacer(minLength: 40)
            Text("TEST")
                .onTapGesture {
                    print("Delete")
                }
        }
    }.frame(width: 100)
)

或者您可以尝试其他方法,例如 ZStackMenu(您提到了更好的解决方案)