You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SwiftUI工具栏菜单中正确设置图标尺寸?

SwiftUI菜单内图标尺寸异常问题

工具栏中图标显示正常

在工具栏中使用MyImage组件显示图标时,尺寸完全符合预期:

工具栏中正常显示的图标

对应代码:

MyImage( "square.CornerToCorner")

菜单内图标尺寸异常

将按钮嵌套进Menu组件后,图标出现异常放大的情况:

菜单内异常显示的图标

对应代码:

Menu( content:{
    Button( action:{ }) {
        MyImage( "cornerToCorner" )
            .frame( width: 18, height: 18 )
    }
}, label:{
    MyImage( "cornerToCorner" )
        .frame( width: 18, height: 18 )
})

MyImage组件实现

MyImage组件逻辑简单,仅返回可缩放图片并设置固定尺寸,在工具栏、侧边栏等其他场景下显示均正常,仅在菜单中出现问题:

return Image( name )
    .resizable()
    .frame( width: 18, height: 18 )

额外观察现象

  • 64x64和32x32规格的图片在菜单中会以原始尺寸显示
  • 相同尺寸的图标放在一起显示正常,混合不同尺寸图标时,所有图标会统一以最大尺寸显示

混合尺寸图标时的异常显示

可复现代码

以下完整代码可复现该问题,目标图标在其他场景均显示正常:

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            ToolbarView( )
            Text("Hey!!")
        }
        .padding()
    }
}

struct ToolbarView: View {
    var body: some View {
        VStack { }
            .toolbar{
                ToolbarItemGroup(placement: .principal) {
                    Menu( content:{ // TODO:  large graphics.
                        Button( action:{ }) {
                            MyImage( name: "square.CornerToCorner" )
                                .frame( width: 18, height: 18 )
                        }
                    }, label:{ MyImage( name: "square.CornerToCorner" )})   //.frame(width: 20, height: 20)})
                }
            }
    }
}

struct MyImage: View {
    let name: String

    var body: some View {
//      if ( NSImage(named: name) != nil ) {
            return Image( name )
                .resizable()
                .frame( width: 18, height: 18 )
//      }
    }
}

原始SVG代码

<?xml version="1.0" encoding="utf-8"?><svg viewBox="0 0 108 108" width="100%" height="100%" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><defs /><rect x="36" y="36" width="90" height="90" fill="none" stroke="#000000" stroke-width="4" stroke-linecap="butt" stroke-linejoin="miter" stroke-dasharray="4,4" transform="matrix(1.002457 0 0 1.002457 -34.71007 -34.71007)" /><rect x="117" y="117" width="18" height="18" fill="#000000" fill-opacity="1" transform="matrix(1.002457 0 0 1.002457 -34.71007 -34.71007)" /><rect x="117" y="117" width="18" height="18" fill="none" stroke="#000000" stroke-width="1.5" stroke-linecap="butt" stroke-linejoin="miter" stroke-dasharray="none" transform="matrix(1.002457 0 0 1.002457 -34.71007 -34.71007)" /><line x1="36" y1="36" x2="126" y2="126" stroke="#000000" stroke-width="4" stroke-linecap="butt" stroke-linejoin="miter" stroke-dasharray="4,4" transform="matrix(1.002457 0 0 1.002457 -34.71007 -34.71007)" /></svg>

内容的提问来源于stack exchange,提问作者Keith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:05:03