Ios 未检测到UITabBar触摸上方Utoolbar上方模式视图中的Ui按钮

Ios 未检测到UITabBar触摸上方Utoolbar上方模式视图中的Ui按钮,ios,objective-c,uibutton,touch,uibarbuttonitem,Ios,Objective C,Uibutton,Touch,Uibarbuttonitem,我的视图底部有一个工具栏。有一个叫做扫描的UIBarButton,它需要检测什么时候有人把手指放低,什么时候有人抬起 因为UIBarButton继承自UIControl,所以我无法检测到这一点。作为一种解决方法,我创建了一个不可见的UIButton,并将其放在我的工具栏顶部,简单地检测来自它的触摸,而不是UIBarButton 这可以正常工作,直到我将视图显示为模式视图(隐藏UITabBar),如果我触摸工具栏的位置,我无法检测到它。如果我触摸工具栏上方,它工作正常 这是一个截图。(不可见按钮已

我的视图底部有一个工具栏。有一个叫做扫描的UIBarButton,它需要检测什么时候有人把手指放低,什么时候有人抬起

因为UIBarButton继承自UIControl,所以我无法检测到这一点。作为一种解决方法,我创建了一个不可见的UIButton,并将其放在我的工具栏顶部,简单地检测来自它的触摸,而不是UIBarButton

这可以正常工作,直到我将视图显示为模式视图(隐藏UITabBar),如果我触摸工具栏的位置,我无法检测到它。如果我触摸工具栏上方,它工作正常

这是一个截图。(不可见按钮已被涂成红色,并拉伸至较高,以便测试)

在下面的屏幕截图中,如果触摸工具栏所在的位置,则不会发生任何事情。但在它上面,它是红色的,它可以完美地工作

这是我的一些代码

    - (IBAction) scanTouchUp:(id)sender {
    [linea barcodeStopScan:nil];  
}

- (IBAction) scanTouchDown:(id)sender {
    [linea barcodeStartScan:nil];   
}
这些方法分别附在“触地”和“内部/外部触地”上


任何帮助都将不胜感激。

如果UIButton超出其父视图的边缘,或覆盖了不同子视图的一部分,则可能是命中测试不适用于该按钮。(即按钮位于底部栏的顶部)

您可以通过确保按钮通过点击测试来解决这些问题。您可以通过覆盖包含按钮的视图上的
hitTest:withEvent:
方法来完成此操作。这可能看起来像这样:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
  UIView *result = [redButton hitTest:[redButton convertPoint:point fromView:self] withEvent:event];
  if (result)
    return result;

  return [super hitTest:point withEvent:event];
}

只有在将此更改添加到的视图在包含给定点的另一个视图之前进行了命中测试时,此操作才会起作用。

与其手动在工具栏上创建不可见按钮,不如尝试使用

-(id)initWithCustomView:(UIView*)customView

并将其作为其他项目添加到工具栏


这个自定义视图(传递给上述方法)将是一个“扫描”按钮。然后,您就可以随心所欲地处理它,而不必求助于一些不可见的控件。

您可以试试这个。我认为您需要先将工具栏添加到子视图中。然后,只有将不可见按钮添加到子视图中。确保它们都具有相同的superview。

所以红色部分是您仍然希望在模式视图中检测触摸的位置?只有红色的部分吗?是的,红色盒子下面是一个uibarbutton项目,上面写着“扫描”。当你按住红色部分时,它会激活条形码扫描器外围设备。其次,它几乎肯定是命中测试。在其SuperView边界之外绘制的视图可见,但不可点击。在视图中将
clipstobunds
设置为
YES
将有助于调试此类问题。我得到的“UIViewController”的“No visible@interface”声明了“return[super hitTest:point with Event:Event]”的选择器“hitTest:withevent:”;是的,您需要将要添加按钮的视图子类化为子视图。我将其子类化。我创建了一个IBOutlet。然后在我的nib中,我将UIView更改为我的子类,并将该按钮作为一个新的参考插座。这并没有什么不同:(我只是注意到,如果我触地,然后将手指移到按钮的边界之外,并保持触地,它就会记录为触地。