swift - 如何将 View 放在 SwiftUI 中的所有其他视图之上
问题描述
我正在开发 SwiftUI 测试应用程序,并在此处添加了我的自定义下拉菜单。一切正常,除了下拉菜单位于其他视图下方。因此用户无法正确查看和单击下拉菜单。这是我的下拉菜单。
import SwiftUI
var dropdownCornerRadius:CGFloat = 3.0
struct DropdownOption: Hashable {
public static func == (lhs: DropdownOption, rhs: DropdownOption) -> Bool {
return lhs.key == rhs.key
}
var key: String
var val: String
}
struct DropdownOptionElement: View {
var dropdownWidth:CGFloat = 150
var val: String
var key: String
@Binding var selectedKey: String
@Binding var shouldShowDropdown: Bool
@Binding var displayText: String
var body: some View {
Button(action: {
self.shouldShowDropdown = false
self.displayText = self.val
self.selectedKey = self.key
}) {
VStack {
Text(self.val)
Divider()
}
}.frame(width: dropdownWidth, height: 30)
.padding(.top, 15).background(Color.gray)
}
}
struct Dropdown: View {
var dropdownWidth:CGFloat = 150
var options: [DropdownOption]
@Binding var selectedKey: String
@Binding var shouldShowDropdown: Bool
@Binding var displayText: String
var body: some View {
VStack(alignment: .leading, spacing: 0) {
ForEach(self.options, id: \.self) { option in
DropdownOptionElement(dropdownWidth: self.dropdownWidth, val: option.val, key: option.key, selectedKey: self.$selectedKey, shouldShowDropdown: self.$shouldShowDropdown, displayText: self.$displayText)
}
}
.background(Color.white)
.cornerRadius(dropdownCornerRadius)
.overlay(
RoundedRectangle(cornerRadius: dropdownCornerRadius)
.stroke(Color.primary, lineWidth: 1)
)
}
}
struct DropdownButton: View {
var dropdownWidth:CGFloat = 300
@State var shouldShowDropdown = false
@State var displayText: String
@Binding var selectedKey: String
var options: [DropdownOption]
let buttonHeight: CGFloat = 30
var body: some View {
Button(action: {
self.shouldShowDropdown.toggle()
}) {
HStack {
Text(displayText)
Spacer()
Image(systemName: self.shouldShowDropdown ? "chevron.up" : "chevron.down")
}
}
.padding(.horizontal)
.cornerRadius(dropdownCornerRadius)
.frame(width: self.dropdownWidth, height: self.buttonHeight)
.overlay(
RoundedRectangle(cornerRadius: dropdownCornerRadius)
.stroke(Color.primary, lineWidth: 1)
)
.overlay(
VStack {
if self.shouldShowDropdown {
Spacer(minLength: buttonHeight)
Dropdown(dropdownWidth: dropdownWidth, options: self.options, selectedKey: self.$selectedKey, shouldShowDropdown: $shouldShowDropdown, displayText: $displayText)
}
}, alignment: .topLeading
)
.background(
RoundedRectangle(cornerRadius: dropdownCornerRadius).fill(Color.white)
)
}
}
struct DropdownButton_Previews: PreviewProvider {
static let options = [
DropdownOption(key: "week", val: "This week"), DropdownOption(key: "month", val: "This month"), DropdownOption(key: "year", val: "This year")
]
static var previews: some View {
Group {
VStack(alignment: .leading) {
DropdownButton(displayText: "This month", selectedKey: .constant("Test"), options: options)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.green)
.foregroundColor(Color.primary)
VStack(alignment: .leading) {
DropdownButton(shouldShowDropdown: true, displayText: "This month", selectedKey: .constant("Test"), options: options)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.green)
.foregroundColor(Color.primary)
}
}
}
这是它的样子。
有没有人遇到过这个问题?谁能帮我解决这个问题?谢谢。
解决方案
试着把所有东西都放进去,ZStack
然后用zIndex
forDropdownButton
把它放在上面,比如
ZStack {
// ... other content here
DropdownButton(displayText: "This month",
selectedKey: .constant("Test"),
options: options).zIndex(10)
// ... other content here
推荐阅读
- android - 通话中对 Android 音频路由有何影响?
- android - Android CameraX 返回成功但不保存图片
- python - 解密在 O(N) 时间内运行的基数排序的字符串排序版本
- python - 使用 Gekko 的模拟模式 - 初始值为零的变量 C2 (NH2Cl) 不起作用 - 为什么?
- r - 将单个表中的两列合并为一列
- c# - HtmlRendererCore.PdfSharpCore 弹性框
- google-play - 在 Google Play 和 App Store 中获取当前应用版本
- r - 如何在ggplot的图形上写出某个变量的值?
- shell - 如何遍历makefile中的字符串?
- python-3.x - 我可以使用 zip 对象两次吗?