xcode 以编程方式将NavigationSplitView折叠为一列

xam8gpfp  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(129)

我已经开发了一个SwiftUI NavigationSplitView应用程序,它有两个列,它可以按预期工作。我选择了动态字体,并精心制作了视觉元素,以响应用户的视觉可访问性设置。我知道,一些用户谁将雇用这个应用程序将有字体大小设置为最大的可用。虽然这增强了他们对细节屏幕的看法,但它几乎使侧边栏无法阅读。我试图找到一种方法来改变基于动态类型的大小的应用程序的行为。具体来说,我希望iPad的行为与iPhone的行为相同,基于我定义的字体大小。事实上,iPhone上的应用程序会折叠成一列。我还没能找到一种方法在iPad上以编程方式做到这一点。
我试过:
设置horizontalSizeClass,正如预期的那样,这只是一个getter。.horizontalSizeClass = .紧密的
我尝试将细节的列宽设置为0。.navigationSplitViewColumnWidth(0)不起作用
我尝试使用旧的stack函数。.navigationViewStyle(StackNavigationViewStyle())不起作用。
显然,这是可以做到的,因为当设备是iPhone时,它是自动的。我想我可以创建两个视图--一个堆叠视图和一个拆分视图,并根据状态变量进行选择,但这似乎有点粗糙。
任何指导将不胜感激。Xcode 14 beta 6,iOS 16

ou6hu8tu

ou6hu8tu1#

这是一个很好的想法,可以通过根据dynamicTypeSize的环境值覆盖环境中的horizontalSizeClass来实现,如下所示:

struct NavigationSplitViewTest: View {
    @Environment(\.dynamicTypeSize) var dynamicTypeSize

    var body: some View {
        ViewContainingSplitView()
            .environment(\.horizontalSizeClass, dynamicTypeSize > .large ? .compact : .none)
    }
}

我通过在iPad模拟器上启动应用程序来测试它,它是在2列,然后切换到设置以增加类型大小一个缺口,然后回到应用程序,它已经切换到单列。然而,当试图切换大小回来,我注意到显示/隐藏列按钮消失了,所以我想我们有一些反馈提交。

hk8txs48

hk8txs482#

我仍然没有找到一个优雅的方法来做到这一点,但我的解决方案在这里工作。
基本上,我为NavigationSplitView和NavigationStack编写代码,并根据Environment(.dynamicTypeSize)。就像这样:

if dynamicTypeSize <= .xxLarge {
    NavigationSplitView(columnVisibility: $columnVisibility) {
    //all the code
    } detail: {
    //all the code
    }
} else {
    NavigationStack {
    //all the code
    }
}

对于其他人来说,我对这里涉及的术语感到困惑。有DynamicTypeSize,动态字体和更大的辅助功能尺寸。动态字体是那些预先构建的字体,支持开箱即用的动态类型。title,.headline,.动态字体大小是设置中的滑块,允许用户缩放动态字体以满足他们的需要-所有动态字体都随滑块设置缩放。然后,在这些预制字体的设置中的滑块顶部,是更大的辅助功能大小的选项,这为用户提供了更大的选择。
我上面的方案支持iPad和iPhone的所有混合选项。

相关问题