如何在SwiftUI的MenuBarExtra中使用滑块?

2ledvvac  于 2023-04-04  发布在  Swift
关注(0)|答案(1)|浏览(100)

我想实现类似于this question的东西,但使用SwiftUI和MenuBarExtra:

下面是我目前拥有的代码:

MenuBarExtra("Menu Bar App", systemImage: "circle.fill") {    
    Text("Slider below")
    Slider(value: $sliderValue, in: 1...100)
    Text("Slider above")
}

添加.menuBarExtraStyle(.window) * 可以工作 *,但不是我想要的。

7gyucuyw

7gyucuyw1#

这是SwiftUI。你可以显示任何你想要的视图。
然而,这需要一些努力来组成视图。
快速&肮脏,随时改进代码

struct MenuView: View {
    let devices = ["Headphones", "Multi-Output Device", "Soundflower (2ch)", "Soundflower (64ch)"]
    let selectedDevice = 0
    
    var body: some View {
        VStack {
            VStack(alignment: .leading, spacing: 5) {
                Group {
                    Row(title: "Volume:")
                        .foregroundColor(.secondary)
                    Slider(value: .constant(0.2))
                        .padding(.horizontal)
                        .padding(.vertical, 4)
                    Row(title:"Output Device:")
                        .foregroundColor(.secondary)
                    ForEach(0..<devices.count, id: \.self) { index in
                        Row(title: devices[index], hasCheckmark: index == selectedDevice)
                    }
                }
            }
            .padding([.horizontal, .top], 10)
            .frame(maxWidth: 250)
            Divider()
                .frame(maxWidth: 250)
            
            HStack {
                Row(title: "Sound Preferences…")
                Spacer()
            }
            .padding(.leading, 10)
            .padding(.bottom, 6)
            .frame(maxWidth: 250)
        }
    }
}

struct Row: View {
    let title : String
    var hasCheckmark = false
    
    var body: some View {
        HStack(spacing: 4) {
            Group {
                if hasCheckmark {
                    Image(systemName: "checkmark")
                } else {
                    Text("")
                }
            }
            .frame(width: 12)
            Text(title)
        }
    }
}

相关问题