15

我在自定义 UIView 中放置了一个 UIButton 并且该按钮没有接收任何触摸事件(它没有进入突出显示状态,所以我的问题在于无法在处理程序内部连接触摸)。我已经尝试将它放入 Interface Builder 中的 XIB 中,还尝试以编程方式将 UIButton 分别添加到 UIView 中,但都没有成功。我所有的视图都在 UIScrollView 内,所以我首先虽然 UIScrollView 可能会阻止它们,所以我还以编程方式添加了一个按钮,就像我将自定义视图添加到 UIScrollView 中一样,并且按钮工作,消除了 UIScrollView 的可能性成为原因。我的视图的层次结构是这样的:

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

4 回答 4

18

查看测试项目,我相信您的问题在于您创建 TestView 的方式,您没有为其指定框架,所以基本上父视图的大小为 0,而您从 XIB 看到的子视图延伸出父视图,因此不要在响应者链中得到任何东西。

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

于 2012-11-25T00:53:59.757 回答
6

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

在确保按钮的超级视图采用更大的矩形作为框架之后,按钮操作起作用了。

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

于 2015-03-12T18:48:01.667 回答
2

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

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

我已经用我的视图大小的框架对其进行了初始化,它开始响应事件:

CGRect rect = CGRectMake(0,0,width,height);
MyView *view = [[MyView alloc] initWithFrame:rect];
于 2012-11-25T00:52:15.837 回答
1

故事板解决方案

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

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

在我的例子中,我选择了将 UIButton 嵌入到 UIView 中,而故事板上没有插图。在 UIButton 和 superview 之间添加额外的高度约束允许 UIButton 响应触摸。

您可以通过启动View Debugger来确认问题,并直观地确认 UIButton 的 superview不可选择。

(Xcode 11,*- 也应该在早期版本中工作)

于 2019-09-22T23:39:38.230 回答