我使用下一个方法创建左栏按钮项:
- (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)但是像第二种情况那样可点击区域
答案 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)
我将其固定在使用的辅助功能框架中。 只需将按钮的辅助功能框架设置为增加的高度和宽度即可使用。