UIBarButtonItem点击区域

时间:2013-05-31 13:27:32

标签: 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)但是像第二种情况那样可点击区域

4 个答案:

答案 0 :(得分: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。

希望这有帮助!

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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];

答案 3 :(得分:0)

我将其固定在使用的辅助功能框架中。 只需将按钮的辅助功能框架设置为增加的高度和宽度即可使用。

相关问题