You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置Toolbar按钮使其在工具栏与溢出菜单均正确显示?

解决Toolbar按钮在横屏/溢出菜单的适配问题

要实现按钮在Toolbar(横屏)显示指定尺寸图标、在溢出菜单(竖屏)显示图标+文本的需求,核心是利用SwiftUI的@Environment(\.isInOverflowMenu)环境变量,判断按钮当前是否处于溢出菜单中,从而动态调整显示样式。

方法一:直接在Button中动态切换内容

这种方式简单直接,针对两种场景分别返回对应的视图:

// 定义工具栏按钮图标尺寸
let toolbarButtonImageSize: CGFloat = 24

Button {
    // 按钮点击逻辑
} label: {
    @Environment(\.isInOverflowMenu) private var isInOverflowMenu
    
    if isInOverflowMenu {
        // 溢出菜单中显示图标+文本标签
        Label("Button label", image: imageName)
    } else {
        // Toolbar中显示固定尺寸的图标
        Image(imageName)
            .resizable()
            .scaledToFit()
            .frame(width: toolbarButtonImageSize, height: toolbarButtonImageSize)
    }
}

方法二:自定义LabelStyle(复用性更强)

如果有多个工具栏按钮需要适配,自定义LabelStyle可以避免重复代码:

struct AdaptiveToolbarLabelStyle: LabelStyle {
    let iconSize: CGFloat
    
    @Environment(\.isInOverflowMenu) private var isInOverflowMenu
    
    func makeBody(configuration: Configuration) -> some View {
        if isInOverflowMenu {
            // 溢出菜单使用默认的图标+文本样式
            Label(configuration.title, icon: configuration.icon)
        } else {
            // Toolbar中仅显示固定尺寸的图标
            configuration.icon
                .resizable()
                .scaledToFit()
                .frame(width: iconSize, height: iconSize)
        }
    }
}

// 使用自定义样式的按钮
Button {
    // 按钮点击逻辑
} label: {
    Label("Button label", image: imageName)
}
.labelStyle(AdaptiveToolbarLabelStyle(iconSize: 24))

效果说明

  • 横屏时,按钮在Toolbar中显示指定尺寸的图标,符合你第一种方式的需求;
  • 竖屏时,按钮进入溢出菜单,自动显示图标+完整文本标签,同时图标会适配溢出菜单的默认尺寸,无需额外调整。

内容的提问来源于stack exchange,提问作者Reinhard Männer

火山引擎 最新活动