【问题标题】:UIButton not getting touches when added to self.view添加到 self.view 时,UIButton 没有被触摸
【发布时间】:2012-11-28 10:47:59
【问题描述】:

我有这个运行良好的方案(--> = "has subview"):

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

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

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 看起来像这样:

【问题讨论】:

  • 大概您已经尝试在整个层次结构中设置“@property(nonatomic, getter=isUserInteractionEnabled) BOOL userInteractionEnabled”?
  • @Ōkami 是的。所有userInteractionEnabled 都已设置。否则,如果添加到图像视图中,按钮将不起作用,对吧?
  • @Mundi:你是在向 imageView 添加按钮吗?
  • 没有。我觉得上面的解释很清楚了。

标签: iphone ios uibutton touch subview


【解决方案1】:

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

[self.view bringSubviewToFront:<UIButton_INSTANCE>];

【讨论】:

  • 对不起。该按钮是容器视图的子视图。如前所述,将容器视图添加到图像视图时效果很好,这排除了这种可能性。
  • 是的,从您的问题中可以清楚地看出这一点。这就是为什么我在回答中可能提到的原因,因此可能是这种情况。你试过一次吗?
  • 当然。创建后和viewDidAppear.
【解决方案2】:

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

【讨论】:

  • 图像视图确实比容器视图和按钮大。但它应该在容器视图的后面。按钮肯定在容器视图中,所以这也不是原因。
  • 您好,我刚刚重建了您的结构,无法复制问题。这一切都像您期望的那样工作。如果 UIButton 在容器框架内,则注册触摸。将容器添加为 imageView 的子视图没有任何区别。如果您可以发布视图创建和子视图添加代码,也许我忽略了一些东西。
【解决方案3】:

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

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

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

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

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

【讨论】:

  • 我尝试了touchesBegan 方法。它只捕获图像视图的触摸。按钮不被触摸。好吧,我们已经知道了。如上所述,当按钮的容器作为子视图添加到图像视图时,按钮已正确连接并按预期工作。
猜你喜欢
  • 2023-04-03
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多