3

我的视图底部有一个工具栏。有一个名为 Scan 的 UIBarButton 需要检测某人何时按住手指以及何时抬起手指。

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

如果我触摸工具栏所在的位置我无法检测到它,这工作正常,直到我将视图呈现为模态视图(隐藏 UITabBar)。如果我触摸工具栏上方,它工作正常。

这是一个屏幕截图。(隐形按钮已被涂成红色并拉高以进行测试)

工作状态

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

在此处输入图像描述

这是我的一些代码。

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

- (IBAction) scanTouchDown:(id)sender {
    [linea barcodeStartScan:nil];   
}

这些方法分别附加到“Touch Down”和“Touch Up Inside/Outside”。

任何帮助,将不胜感激。

4

3 回答 3

1

如果 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];
}

这仅在您添加此更改的视图在包含给定点的另一个视图之前进行命中测试时才有效。

于 2013-09-28T19:12:57.877 回答
0

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

于 2013-10-05T00:41:54.813 回答
0

不要在工具栏上手动创建一个不可见的按钮,而是尝试创建一个UIBarButton实例

- (id)initWithCustomView:(UIView *)customView

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

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

于 2013-10-01T19:00:01.317 回答