导航栏自定义UIBarButtonItem尺寸问题:设置frame无效
我之前也碰到过一模一样的问题!你直接给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
相关产品推荐
相关产品推荐

