6

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

- (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 作为按钮时,它不起作用。因此,在这种情况下,我在一个 od 上的按钮显示了 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),但第二种情况下的可点击区域

4

4 回答 4

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。

希望这可以帮助!

于 2013-05-31T13:49:44.300 回答
1

您可以使用 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];
于 2019-02-25T14:01:28.507 回答
0

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

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

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

于 2013-05-31T13:36:36.547 回答
0

我将它固定在使用过的可访问性框架中。只需为增加高度和宽度的按钮设置可访问性框架,它就会起作用。

于 2019-07-15T10:07:58.923 回答