首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >工具栏中具有分段控件的macOS SwiftUI应用程序选项卡视图

工具栏中具有分段控件的macOS SwiftUI应用程序选项卡视图
EN

Stack Overflow用户
提问于 2019-10-12 11:09:35
回答 2查看 2.1K关注 0票数 10

我正在尝试用SwiftUI创建一个macOS应用程序。我需要一个TabView或类似的东西,但当我使用TabView时,分段控件不在macOS工具栏中。Click here to see an example of what I would like

我当前的代码是:

代码语言:javascript
运行
复制
import SwiftUI

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

The result is here as an image

分段控件需要位于工具栏中,而不是视图中。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-03-11 02:16:47

以下是实现此目标的可能方法的简化演示。经过测试,可与Xcode 11.2配合使用。

1)在AppDelegate中准备具有所需样式和背景的窗口

代码语言:javascript
运行
复制
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)准备窗口内容视图以具有所需的行为

代码语言:javascript
运行
复制
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)")
    }
}
票数 2
EN

Stack Overflow用户

发布于 2020-11-30 00:47:50

当我想在macOS BigSur上构建类似的东西时,我偶然发现了你的问题。我使用的是Xcode12.2

以下是我的解决方案受Asperi答案的启发。将窗口组的标题设置为空字符串"“很重要,否则它看起来很奇怪。

请注意,它只在运行应用程序时才起作用,而不是在预览中!

应用程序文件

代码语言:javascript
运行
复制
import SwiftUI

@main
struct SegmentedToolbarApp: App {
    var body: some Scene {
        WindowGroup("") {
            ToolbarItemPlacement()
        }
    }
}

ToolbarItemPlacement视图

重要的部分是与校长的安置。

设置一个更大的minWidth也很重要-否则工具栏就会消失!

代码语言:javascript
运行
复制
import SwiftUI

struct ToolbarItemPlacement: View {
    
    private let tabs = ["Watch Now", "Movies", "TV Shows", "Kids", "Library"]
    @State private var selectedTab = 0
    
    var body: some View {
        VStack {
            ChildTabView(title: self.tabs[self.selectedTab], index: self.selectedTab)
        }
        .toolbar {
            ToolbarItem(placement: .principal) {
                
                Picker("", selection: $selectedTab) {
                    ForEach(tabs.indices) { i in
                        Text(self.tabs[i]).tag(i)
                    }
                }
                .pickerStyle(SegmentedPickerStyle())
                .padding(.top, 8)
            }
        }
        .frame(minWidth: 800, minHeight: 400)
    }
}

ChildTabView

代码语言:javascript
运行
复制
struct ChildTabView: View {
    var title: String
    var index: Int

    var body: some View {
        Text("\(title) - Index \(index)")
            .padding()
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58350513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档