UIView内的UIButton不响应触摸事件

时间:2012-11-25 00:24:53

标签: objective-c uiview uibutton interface-builder xib

我在自定义UIView中放置了一个UIButton并且按钮没有接收任何触摸事件(它没有进入突出显示的状态,所以我的问题是关于无法接线向上触摸内部处理程序)。我已经尝试将它放入Interface Builder中的XIB中,并尝试以编程方式将UIButton单独添加到UIView中,两者都没有运气。我的所有视图都在UIScrollView中,所以我首先虽然UIScrollView可能会阻止它们,所以我还以编程方式添加了一个按钮,就像我将自定义视图添加到UIScrollView中一样,按钮工作,消除了UIScrollView的可能性是原因。 My View的hiearchy是这样的:

ss

按钮位于图像视图上方,前面层没有完全占据我的按钮,因此我没有理由不与按钮进行物理交互。在我的自定义视图的代码端,我正在创建我的视图:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        UIView *sub = [[[NSBundle mainBundle] loadNibNamed:@"ProfileView" owner:self options:nil] objectAtIndex:0];
        [self addSubview:sub];
        [sub setUserInteractionEnabled:YES];
        [self setUserInteractionEnabled:YES];
        CALayer *layer = sub.layer;
        layer.masksToBounds = YES;
        layer.borderWidth = 5.0;
        layer.borderColor = [UIColor whiteColor].CGColor;
        layer.cornerRadius = 30.0;
        /*layer.shadowOffset = CGSizeZero;
        layer.shadowRadius = 20.0;
        layer.shadowColor = [[UIColor blackColor] CGColor];
        layer.shadowOpacity = 0.8;
        */
    }
    return self;
}

我尝试了setUserInteractionsEnabled的所有组合,但没有运气。 (是的,也将它们设置为在Interface Builder中检查)。我还读了一个类似问题的另一个问题,我应该尝试重写'canBecomeFirstResponder'来返回'YES',我也做了。但问题仍然存在,我无法点击按钮。我没有给按钮任何特殊的属性,设置,它只是一个常规的。我在视图中的其他对象(下面的标签,按钮后面的图像视图等)正常工作没有问题。这可能有什么问题?

谢谢,

可以。

更新:以下是问题的快速复制:https://dl.dropbox.com/u/79632924/Test.zip 尝试运行并单击按钮。

4 个答案:

答案 0 :(得分:18)

看一下测试项目,我相信你在创建TestView的方式上遇到了问题,你没有为它指定框架,所以基本上父视图的大小为0,你从XIB看到的子视图延伸到了父视图之外查看,因此在响应者链中没有得到任何东西。

您应该在创建TestView时指定帧,或者在加载XIB文件后调整帧。

答案 1 :(得分:5)

我也遇到过这个问题。我的原因是UIButton超视图框架的高度为0,所以我相信即使触摸发生了,也没有传递给按钮。

确保按钮的超级视图将较大的矩形作为一个框架后,按钮操作起作用。

我这个问题的根本原因是错误的自动布局实现(我忘了为按钮的超级视图设置高度限制)。

答案 2 :(得分:2)

我找到了解决方案。我正在将自定义视图初始化为:

MyView *view = [[MyView alloc] init];

我用它的视图大小的框架初始化它,它开始响应事件:

CGRect rect = CGRectMake(0,0,width,height);
MyView *view = [[MyView alloc] initWithFrame:rect];

答案 3 :(得分:1)

故事板解决方案

仅适用于在使用情节提要和约束时想要解决此问题的人。

  

在具有相同高度限制的超级视图(包含按钮)和UIButton之间添加一个限制。

在我的情况下,我选择将UIButton嵌入在故事板上没有嵌入的UIView中。在UIButton和父视图之间添加额外的高度限制,使UIButton可以响应触摸。

您可以通过启动 View Debugger (视图调试器)来确认问题,并直观地确认UIButton的超级视图是不可可选的。

(Xcode 11,*-在早期版本中也应使用)