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

不使用contentEdgeInsets如何增大iOS导航栏返回按钮的点击区域

解决方案

方案1:扩大按钮frame+调整imageEdgeInsets(无侵入,无需自定义子类)

你可以直接把按钮的尺寸调大到你想要的点击区域大小,再通过imageEdgeInsets调整图标位置,让图标保持在原本的显示位置,不会发生偏移。
针对你的代码修改示例:

// 原来的size是40x40,现在改成左右各扩10pt,总宽度60,高度不变
CGSize hitSize = CGSizeMake(60, 40); 
UIImage *image = [self make];
UIButton *back = [self.class buttonForBarItemByImage:image size:hitSize];
// 调整image的内边距,让图标保持在原本左侧的位置,右内边距设20(因为总宽度多了20),图标就不会偏移
back.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 20);
UIBarButtonItem *backArrow = [[UIBarButtonItem alloc] initWithCustomView:back];
[back addTarget:backArrow action:@selector(backArrow_onClick) forControlEvents:UIControlEventTouchUpInside];

这个方法不需要修改原有按钮创建逻辑,只需要调整尺寸和图片内边距即可,实现成本最低。

方案2:自定义UIButton子类重写点击判断逻辑(灵活度更高)

如果需要更灵活的控制点击区域,比如上下左右扩大的范围不同,可以自定义UIButton子类,重写pointInside:withEvent:方法,手动扩大点击响应范围:
首先创建自定义子类:

@interface EnlargedClickButton : UIButton
/// 额外增加的点击边距,正数表示向外扩大,负数表示向内缩小
@property (nonatomic, assign) UIEdgeInsets hitTestEdgeInsets;
@end

@implementation EnlargedClickButton
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    if (UIEdgeInsetsEqualToEdgeInsets(self.hitTestEdgeInsets, UIEdgeInsetsZero) || self.hidden || self.alpha < 0.01) {
        return [super pointInside:point withEvent:event];
    }
    CGRect hitBounds = UIEdgeInsetsInsetRect(self.bounds, self.hitTestEdgeInsets);
    return CGRectContainsPoint(hitBounds, point);
}
@end

然后修改你的按钮创建代码,改用这个自定义类,设置扩大的点击边距即可,不需要修改原有按钮的尺寸和位置:

+ (UIButton *) buttonForBarItemByImage:(UIImage *)image size:(CGSize)size {
    // 改用自定义按钮类
    EnlargedClickButton *back = [EnlargedClickButton buttonWithType:UIButtonTypeCustom];
    // 左右各扩大10pt点击区域,上下不变
    back.hitTestEdgeInsets = UIEdgeInsetsMake(0, -10, 0, -10);
    [back setImage:image forState:UIControlStateNormal];
    CGSize buttonSize = size;
    back.frame = CGRectMake(0, 0, buttonSize.width, buttonSize.height);
    return back;
}

这个方案的优势是按钮的显示尺寸、位置完全不需要调整,仅修改响应范围,适配性更强。

注意事项

  • 不要使用contentEdgeInsets调整点击范围,这个属性会同时修改内容的布局位置,就会出现你遇到的按钮偏移问题
  • UIBarButtonItem的customView尺寸不会被导航栏强制压缩,只要你设置的customView尺寸合理,不会影响导航栏其他元素的布局

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:54:02