首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NSSplitViewController时调整SwiftUI大小

使用NSSplitViewController时调整SwiftUI大小
EN

Stack Overflow用户
提问于 2020-05-06 04:30:33
回答 1查看 957关注 0票数 2

我试图在NSSplitViewController中使用SwiftUI,并有一个简单的主视图和细节视图,如下所示。这很好,但是在调整窗口大小时,SplitView无法展开,而在视图调试器中,我看到几何图形具有调整大小窗口的尺寸。

如何使SplitView根据窗口尺寸(或GeometryReader)调整大小。

代码语言:javascript
复制
struct SampleView: View {
    @EnvironmentObject var env : AppEnvironment

    var body: some View {
        Group {
            if (self.env.files.isEmpty) {
                Text("loading")
            } else {
                GeometryReader { geometry in
                    SplitView(master: {
                        Text("master")
                            .background(Color.yellow)
                    }, detail: {
                        Text("Detail")
                            .background(Color.orange)
                    }).frame(width: geometry.size.height, height: geometry.size.height)
                }
            }
        }
    }
}

下面是SplitView的实现

代码语言:javascript
复制
//
// Source: https://gist.github.com/HashNuke/f8895192fff1f275e66c30340f304d80
//
struct SplitView<Master: View, Detail: View>: View {
    var master: Master
    var detail: Detail

    init(@ViewBuilder master: () -> Master, @ViewBuilder detail: () -> Detail) {
        self.master = master()
        self.detail = detail()
    }

    var body: some View {
        let viewControllers = [NSHostingController(rootView: master), NSHostingController(rootView: detail)]
        return SplitViewController(viewControllers: viewControllers)
    }
}

struct SplitViewController: NSViewControllerRepresentable {
    var viewControllers: [NSViewController]

    private let splitViewResorationIdentifier = "com.company.restorationId:mainSplitViewController"

    func makeNSViewController(context: Context) -> NSViewController {
        let controller = NSSplitViewController()

        controller.splitView.dividerStyle = .thin
        controller.splitView.autosaveName = NSSplitView.AutosaveName(splitViewResorationIdentifier)
        controller.splitView.identifier = NSUserInterfaceItemIdentifier(rawValue: splitViewResorationIdentifier)
        let vcLeft = viewControllers[0]
        let vcRight = viewControllers[1]
        vcLeft.view.widthAnchor.constraint(greaterThanOrEqualToConstant: 30).isActive = true
        vcRight.view.widthAnchor.constraint(greaterThanOrEqualToConstant: 70).isActive = true
        let sidebarItem = NSSplitViewItem(contentListWithViewController: vcLeft)
        sidebarItem.canCollapse = false

        // I'm not sure if this has any impact
        // controller.view.frame = CGRect(origin: .zero, size: CGSize(width: 800, height: 800))
        controller.addSplitViewItem(sidebarItem)

        let mainItem = NSSplitViewItem(viewController: vcRight)
        controller.addSplitViewItem(mainItem)

        return controller
    }

    func updateNSViewController(_ nsViewController: NSViewController, context: Context) {
        print("should update splitView", nsViewController.view.superview?.frame, nsViewController.view.frame)
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-06 05:35:30

问题不在拆分视图中,而是在内容子视图中,默认情况下,SwiftUI视图被收紧为内容,因此如下所示

代码语言:javascript
复制
SplitView(master: {
    Text("master")  // Master content view
        .frame(maxWidth: .infinity, maxHeight: .infinity) // << here !!
        .background(Color.yellow)
}, detail: {
    Text("Detail") // Details content view
        .frame(maxWidth: .infinity, maxHeight: .infinity)  // << here !!
        .background(Color.orange)
})

给出似乎是意料之中的东西

注意:我使用了.frame(width: geometry.size.width, height: geometry.size.height),因为我认为它是一个错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61627448

复制
相关文章

相似问题

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