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

导航栏自定义UIBarButtonItem尺寸问题:设置frame无效

解决自定义UIBarButtonItem尺寸不生效的问题

我之前也碰到过一模一样的问题!你直接给UIButton设置frame之所以没用,是因为UIBarButtonItem的customView会被导航栏的Auto Layout系统接管,你手动设置的frame会被覆盖掉,导航栏会根据视图的intrinsicContentSize(固有尺寸)来调整它的显示大小。

给你两种靠谱的解决办法:

方法一:用Auto Layout约束固定尺寸

这是最稳妥的方式,直接给UIButton添加宽高约束,让导航栏尊重你想要的尺寸:

let rightButton = UIButton(type: .custom)
rightButton.setImage(UIImage(named: "hamburgerMenuIcon"), for: .normal)

// 添加宽高约束,替换原来的frame设置
rightButton.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    rightButton.widthAnchor.constraint(equalToConstant: 10),
    rightButton.heightAnchor.constraint(equalToConstant: 10)
])

// 绑定按钮点击事件
rightButton.addTarget(self, action: #selector(handleRightButtonTap), for: .touchUpInside)
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: rightButton)

// 对应的点击处理方法
@objc private func handleRightButtonTap() {
    // 这里写你的点击逻辑
}

方法二:调整按钮的内容边距或图片尺寸

如果你的图标本身尺寸比10x10大,导航栏会默认按图片的实际大小显示按钮。这时候你可以:

  • 直接把图标素材改成10x10的尺寸;
  • 或者给按钮设置imageEdgeInsets来缩小图片的显示范围:
rightButton.setImage(UIImage(named: "hamburgerMenuIcon"), for: .normal)
// 假设图片原尺寸是20x20,设置内边距让显示区域压缩到10x10
rightButton.imageEdgeInsets = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)

另外提醒一下,你原来的代码里把target和action设为nil,这样按钮点击是没有反应的,记得给UIButton添加addTarget(_:action:for:)来绑定点击事件哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:42:02