0

我有这个工作正常的方案(-->=“有子视图”):

ViewController.view --> imageView --> containerView --> UIButton

正如预期的那样,按钮会触发指定的选择器。
但是,如果我执行以下操作(出于多种原因,最好这样做),按钮将停止接收 touches

ViewController.view --> imageView
ViewController.view --> containerView --> UIButton
[self.view bringSubviewToFront:_containerView]; 

有什么线索吗?

- 更新

响应请求,这里是一些按钮创建代码:

// in viewDidLoad

_controlsView = [[[NSBundle mainBundle] loadNibNamed:@"Controls" 
       owner:self options:nil] objectAtIndex:0];
_controlsView.frame = CGRectMake(0, 50, 
      _controlsView.bounds.size.width, _controlsView.bounds.size.height);
[self.view addSubview:_controlsView];
// ...
[_controlsView.superview bringSubviewToFront:_controlsView];

// in viewDidAppear

if (!_demoButton) {
   _demoButton = (UIButton*)[_controlsView viewWithTag:kDemoButtonTag];
   [_demoButton addTarget:self action:@selector(buttonPressed:) 
       forControlEvents:UIControlEventTouchUpInside];
   // configuration, color, font, layer, etc. all works well
}

最后,Controls.xib看起来像这样:

IB中的截图

4

3 回答 3

1

Probably你的观点决定了你的按钮。试试这个

[self.view bringSubviewToFront:<UIButton_INSTANCE>];
于 2012-11-28T10:55:31.400 回答
0

当我在容器视图的框架之外设置了一个控件元素时,有时会发生这种情况,这也发生在我身上。我没有对此进行测试,但是由于您有许多嵌套视图,因此它可能发生在第一个实例上,因为图像视图可能大到足以包含 UIButton。

于 2012-11-28T10:56:31.440 回答
0

由于代码不足,无法准确找出发生这种情况的原因。

我想您应该尝试编写一个 UIButton 类别来覆盖-touchesBegan:withEvent: -touchesMoved:withEvent: -touchesEnded:withEvent:一些调试信息输出,例如:

{
    [super touchesBegan:touches withEvent:event];
    NSLog(@"Touches began/moved/ended!");
}

当您按下 UIButton 实例并打印调试信息时,这意味着您的 UIButton 实例已接收到触摸事件但未以正确的方式处理它。相反,这意味着响应链中有一个实例阻止了事件传递。

特别是,如果发现只有触摸开始调试信息被打印并且触摸移动调试信息在您的手指移动后不再被打印,您的触摸事件可能被手势识别器阻止。

于 2012-11-28T11:26:15.660 回答