ios - UIBarButtonItem 点击区域

标签 ios objective-c uinavigationbar uibarbuttonitem

我使用下一个方法创建左栏按钮项:

- (void)leftButtonOnNavigationItem:(NSString *)imageName type:(NSInteger)type
{
    UIImage *backImg = [UIImage imageNamed:imageName];
    UIButton *backBtn = [[UIButton alloc] initWithFrame:CGRectMake(0.f, 0.f, backImg.size.width, backImg.size.height)];
    if (type == 0)
        [backBtn addTarget:self.navigationController action:@selector(pop) forControlEvents:UIControlEventTouchUpInside];
    else
        [backBtn addTarget:self action:@selector(leftMake) forControlEvents:UIControlEventTouchUpInside];
    backBtn.contentMode = UIViewContentModeCenter;
    [backBtn setImage:backImg forState:UIControlStateNormal];
    UIView *backBtnView = [[UIView alloc] initWithFrame:backBtn.bounds];
    backBtnView.bounds = CGRectOffset(backBtnView.bounds, -6, 0);
    [backBtnView addSubview:backBtn];
    UIBarButtonItem *backBarBtn = [[UIBarButtonItem alloc] initWithCustomView:backBtnView];
    self.navigationItem.leftBarButtonItem = backBarBtn;
}

我需要在 View 上添加按钮,因为当我对按钮使用 CGRectOffset 时,它不起作用。所以在这种情况下,我的按钮位于显示的 UIViewController 上

enter image description here

这就是我想要的。但是 UIBarButton 开始仅在 UIBarButton(矩形区域)上单击。但是,当我在 UIBarButtonItem 中仅添加按钮时,即使我点击了屏幕上可以看到的 UINavigationBar 区域,它也能正常工作。

我这样添加按钮:

- (void)leftButtonOnNavigationItem:(NSString *)imageName type:(NSInteger)type
{
    UIImage *backImg = [UIImage imageNamed:imageName];
    UIButton *backBtn = [[UIButton alloc] initWithFrame:CGRectMake(0.f, 0.f, backImg.size.width, backImg.size.height)];
    if (type == 0)
        [backBtn addTarget:self.navigationController action:@selector(pop) forControlEvents:UIControlEventTouchUpInside];
    else
        [backBtn addTarget:self action:@selector(leftMake) forControlEvents:UIControlEventTouchUpInside];
    backBtn.contentMode = UIViewContentModeCenter;
    [backBtn setImage:backImg forState:UIControlStateNormal];
//    UIView *backBtnView = [[UIView alloc] initWithFrame:backBtn.bounds];
//    backBtnView.bounds = CGRectOffset(backBtnView.bounds, -6, 0);
//    [backBtnView addSubview:backBtn];
    UIBarButtonItem *backBarBtn = [[UIBarButtonItem alloc] initWithCustomView:backBtn];//View];
    self.navigationItem.leftBarButtonItem = backBarBtn;
}

现在我的按钮是这样显示的

enter image description here

所以 CGRectOffset 不起作用,我的 UIBarButton 非常靠近屏幕左侧,但是通过点击导航栏上的所有区域,它可以正常工作,如您在屏幕上看到的那样。所以我可以触摸导航栏上的所有区域并且 UIBarButton 可以正常工作

所以我需要:UIBarButton 必须像第一种情况一样显示,左侧有更多区域。但它必须像第二种情况一样通过不仅单击按钮而且单击所有环绕区域来工作。我必须做什么?

编辑 在第一种情况下,如果我点击下一个区域,按钮就会被点击

enter image description here

在第二种情况下,如果我点击下一个区域,按钮就会被点击

enter image description here

我需要像第一种情况那样的按钮位置(左侧更多的 origin.x)但像第二种情况一样的可点击区域

最佳答案

所有可以交互的控件/元素都继承自 UIView。 UIView 提供了一个方法叫做 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

可以在您自己的子类中重新实现此方法以增加或减少 View (或您的情况下的按钮)的有效点击区域。例如,将命中区域在所有方向上增加 5 个点

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    return CGRectContainsPoint( CGRectInset( self.bounds, -5, -5 ), point );
}

注意使用 CGRectInset() 时的负值。这是因为该函数是为收缩 CGRect 而设计的,因此通过指定负值,该函数将扩展 CGRect。

希望这对您有所帮助!

关于ios - UIBarButtonItem 点击区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16858433/

相关文章:

ios - 自定义特定后退按钮的标题属性

ios - 给大标题导航栏添加一个按钮

ios - 裁剪字符 - iOS11 - 警报对话框询问

ios - 如何在 Xcode 中配置方案以在归档之前始终运行单元测试?

iphone - 在代码中自动调整 UIImageView 的大小

ios - dispatch_group_t 或 dispatch_semaphore_t 等待多个异步请求完成

jquery - 使用 jQuery 选项卡作为站点导航器?

javascript - 在 UIWebiew 中用 UIImage 替换图像源

c# - 如何从 NSNumber 转换为 .NET 对象

objective-c - iPad drumcomputer touch->音频延迟