未检测到UITabBar触摸的UIToolBar上的模态视图中的UIButton

时间:2013-09-25 19:25:53

标签: ios objective-c uibutton touch uibarbuttonitem

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

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

这一点很好,直到我将视图呈现为模态视图(隐藏UITabBar),如果我触摸工具栏将无法检测到它。如果我触摸工具栏上方,它可以正常工作。

这是截图。 (隐形按钮的颜色为红色,拉伸得很高,以便进行测试)

working state

在下面的屏幕截图中,如果触摸工具栏没有任何反应。但在它上面它是红色的,它完美地运作。

enter image description here

以下是我的一些代码。

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

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

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

任何帮助都将不胜感激。

3 个答案:

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

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

答案 1 :(得分:0)

不要手动在工具栏上创建隐藏按钮,而是尝试使用

创建UIBarButton实例

- (id)initWithCustomView:(UIView *)customView

并将其作为每个其他项目添加到工具栏中。

此自定义视图(传递给上述方法)将是“扫描”按钮。然后,您可以根据需要处理它,而无需使用某些不可见的控件。

答案 2 :(得分:0)

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