UIBarButtonItem点击区域

问题描述 投票:6回答:3

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

- (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

所以这就是我想要的。但是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;
}

现在我的按钮显示如下

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

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

编辑如果我点击下一个区域,点击第一个案例按钮

如果我点击下一个区域,点击第二个案例按钮

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

ios objective-c uinavigationbar uibarbuttonitem
3个回答
3
投票

可以与UIView继承的所有控件/元素。 UIView提供了一种名为- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;的方法

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

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

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

希望这可以帮助!


0
投票

视图的框架是超视图(其父级)中视图的大小和位置。所以,当你去设置backBtnView initWithFrame尝试:

UIView *backBtnView = [[UIView alloc] 
                       initWithFrame:CGRectOffset(backBtn.frame, -6.0, 0.0)];

并且忘记了所有在一起的界限,我认为这会让你朝着正确的方向前进。


0
投票

您可以使用UIEdgeInsetsMake。它对我有用。

UIImage *buttnImage=[UIImage imageNamed:imageName];
UIButton *backButton=[UIButton buttonWithType:UIButtonTypeCustom];
[backButton setImage:buttnImage forState:UIControlStateNormal];
backButton.frame=CGRectMake(0, 0, (buttnImage.size.width+leftMargin+rightMargin), (buttnImage.size.height+topMargin+bottomMargin));
[backButton setImageEdgeInsets:UIEdgeInsetsMake(topMargin, leftMargin, bottomMargin, rightMargin)];

UIBarButtonItem *backBtn=[[UIBarButtonItem alloc]initWithCustomView:backButton];
self.navigationItem.leftBarButtonItems=@[backBtn];
© www.soinside.com 2019 - 2024. All rights reserved.