如何配置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




