macOS SwiftUI App Tab-Ansicht mit segmentiertem Steuerelement in der Symbolleiste

9

Ich versuche eine macOS App mit SwiftUI zu erstellen. Ich brauche ein TabViewoder ähnliches, aber wenn ich TabViewdas segmentierte Steuerelement verwende, befindet es sich nicht in der macOS-Symbolleiste. Klicken Sie hier, um ein Beispiel zu sehen, was ich möchte

Mein aktueller Code lautet:

import SwiftUI

struct ContentView: View {
    var body: some View {
        TabView {
            Text("1")
                .tabItem {
                    Text("1")
            }
        }
    }
}

Das Ergebnis ist hier als Bild

Das segmentierte Steuerelement muss sich in der Symbolleiste und nicht in der Ansicht befinden.

Vielen Dank.

NG235
quelle

Antworten:

1

Hier ist eine vereinfachte Demo eines möglichen Ansatzes, um dies zu erreichen. Getestet und funktioniert mit Xcode 11.2.

Demo

1) Bereiten Sie das Fenster so vor, dass Stil und Hintergrund benötigt werden AppDelegate

func applicationDidFinishLaunching(_ aNotification: Notification) {
    // Create the SwiftUI view that provides the window contents.
    let contentView = ContentView()
        .edgesIgnoringSafeArea(.top)
        .frame(minWidth: 480, maxWidth: .infinity, minHeight: 300, maxHeight: .infinity)

    // Create the window and set the content view. 
    window = NSWindow(
        contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
        styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
        backing: .buffered, defer: false)
    window.center()
    window.titlebarAppearsTransparent = true
    window.titleVisibility = .hidden

    window.setFrameAutosaveName("Main Window")
    window.contentView = NSHostingView(rootView: contentView)
    window.makeKeyAndOrderFront(nil)
}

2) Bereiten Sie die Fensterinhaltsansicht so vor, dass sie das erforderliche Verhalten aufweist

struct ContentView: View {
    private let tabs = ["Watch Now", "Movies", "TV Shows", "Kids", "Library"]
    @State private var selectedTab = 0
    var body: some View {
        VStack {
            HStack {
                Spacer()
                Picker("", selection: $selectedTab) {
                    ForEach(tabs.indices) { i in
                        Text(self.tabs[i]).tag(i)
                    }
                }
                .pickerStyle(SegmentedPickerStyle())
                .padding(.top, 8)
                Spacer()
            }
            .padding(.horizontal, 100)
            Divider()
            GeometryReader { gp in
                VStack {
                    ChildTabView(title: self.tabs[self.selectedTab], index: self.selectedTab)
                }
            }
        }
    }
}

struct ChildTabView: View {
    var title: String
    var index: Int

    var body: some View {
        Text("\(title)")
    }
}
Asperi
quelle
Vielen Dank für Ihre Antwort. Ich bin wirklich auf der Suche nach etwas, das Apples Apps ähnelt, auch wenn es in AppKit enthalten ist. Ihre Antwort wird jedoch geschätzt. Danke
NG235
Ich glaube, dass Apple auf der WWDC 2019 eine SwiftUI Mac-App mit einem segmentierten Steuerelement in der Symbolleiste gezeigt hat.
NG235