如果将 UIButton 作为子视图添加到 UIImageView,则单击 UIButton 不起作用

Posted

技术标签:

【中文标题】如果将 UIButton 作为子视图添加到 UIImageView,则单击 UIButton 不起作用【英文标题】:Click on UIButton Does Not Work if it's Added as Subview to UIImageView 【发布时间】:2013-04-24 09:31:26 【问题描述】:

我有一个简单的UIImageView 动画,我需要检测对它的点击。我添加了一个UIButton,它是这个UIImageView 的子视图。但是,点击它不起作用。我已经在添加到视图时测试了UIButton 本身,并且它可以工作,所以它不是导致问题的按钮。

代码如下:

self.red = [[UIImageView alloc] initWithFrame:CGRectMake(50, 300, 85, 100)];
self.red.image = [UIImage imageNamed:@"red.png"];

[self.red setUserInteractionEnabled: YES];
[self.view addSubview: self.red];
[self.view bringSubviewToFront:self.red]; 

UIButton *redButton = [UIButton buttonWithType: UIButtonTypeCustom];
redButton.frame = CGRectMake(self.red.frame.origin.x, self.red.frame.origin.y, self.red.frame.size.width, self.red.frame.size.height);
[redButton addTarget: self action:@selector(correctButtonClick) forControlEvents: UIControlEventAllTouchEvents];
[redButton setUserInteractionEnabled:YES];

[self.red addSubview: redButton];
[self.red bringSubviewToFront:redButton]; 

我在这里做错了什么?

【问题讨论】:

你在使用滚动视图吗? 只需更新您的按钮框架.. x 和 y 应该是 0,0 【参考方案1】:

代替这条线,redButton.frame = CGRectMake(self.red.frame.origin.x, self.red.frame.origin.y, self.red.frame.size.width, self.red.frame.size.height); 试试这个

redButton.frame = CGRectMake(0,0, self.red.frame.size.width, self.red.frame.size.height); 

编辑:这行[self.red bringSubviewToFront:redButton]; 是不需要的..

【讨论】:

这是个好主意,但无济于事。会不会跟 UIImageView 是动画的有关系?【参考方案2】:

不要插入UIButton 作为子视图,而是使用UITapGestureRecognizer,例如:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(correctButtonClick)];
[self.red addGestureRecognizer:tap];

【讨论】:

【参考方案3】:

你要做的就是反转你的实现,将 UIButton 添加到 UIImageView 不是一个好主意,而是以编程方式创建一个自定义样式的 UIButton,并将 UIImageView 添加为其子视图,肯定会工作

编辑: 至于您当前的实现,您已经在 UIImageView 中添加了 UIButton,因此您可能希望图像的每个部分都接受点击事件,在这种情况下,您的 UIButton 的 x 和 y 坐标将为 0,0 而不是 red.x 和 red.y , 但是宽度和高度是正确的

【讨论】:

是的,它不起作用。就像我说的那样,它自己的按钮位于正确的位置,并且在添加到视图时具有正确的大小。当作为子视图添加到 UIImaggeView 时,它不起作用。当我反转实现(将 UIImage 添加到 UIButton)时,它在没有动画的情况下可以工作,但是当我对其进行动画处理时,它不会对点击做出反应。 在这种情况下它对点击没有反应,请尝试使用 tapGestureRecognizer 如何完全移除 uibutton,并使用 UIImageView 和 tapgesturerecognizer.. 我也试过了,但是不行:self.red = [[UIImageView alloc] initWithFrame:CGRectMake(50, 300, 85, 100)]; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(correctButtonClick)]; [self.red addGestureRecognizer:tap]; self.red.image = [UIImage imageNamed:@"red.png"]; self.red.userInteractionEnabled = YES; [self.view addSubview: self.red];【参考方案4】:

只需执行 self.red.userInteractionEnabled = YES。

UIImageView 默认 userInteractionEnabled NO。

【讨论】:

如果你看一下这个问题,你会发现他已经这样做了[self.red setUserInteractionEnabled: YES]; 在上面的代码中看到这一行[self.red setUserInteractionEnabled: YES];【参考方案5】:

自定义按钮没有 UI。所以你不能选择它。 (您可以尝试使用绑定按钮,或者将一些图像添加到按钮并将按钮 alpha 设置为 0.1 或其他)

@tkanzakic 的答案应该是正确的。 只需将 TapGestureRecognizer 添加到 ImageView 或将 Image 添加到 Button。

【讨论】:

【参考方案6】:

不要使用单独的 imageview 和 Button,使用 Button 中的 imageview 属性。这将解决您的所有问题,并让您无需编写额外的代码行。

UIButton *redButton = [UIButton buttonWithType: UIButtonTypeCustom];

redButton.imageView.image = [UIImage imageNamed:@"red.png"];

redButton.frame = CGRectMake(50, 300, 85, 100);
[redButton addTarget: self action:@selector(correctButtonClick) forControlEvents: UIControlEventAllTouchEvents];
[redButton setUserInteractionEnabled:YES];

[self.red addSubview: redButton];

【讨论】:

我试过这个,但是当按钮动画时,它仍然没有对点击做出反应。我需要一个 UIImageView 或一个 UIButton 动画(图像从屏幕底部飞到顶部)。【参考方案7】:

很简单,按钮没有响应是因为它的框架是错误的,所以它不在你认为的位置。基本上在下面改变你的行:

redButton.frame = CGRectMake(self.red.frame.origin.x, self.red.frame.origin.y, self.red.frame.size.width, self.red.frame.size.height);

用这个:

redButton.frame = CGRectMake(self.red.bounds.origin.x, self.red.bounds.origin.y, self.red.frame.size.width, self.red.frame.size.height);

【讨论】:

不,这没有帮助。当我将 UIButton 作为子视图添加到视图时,它可以工作,它就在 UIImage 视图的后面,但是当我将它作为子视图添加到 UIImageView 时,它不会。我需要它成为 UIImageView 的子视图,因为 UIImageView 稍后会进行动画处理。

以上是关于如果将 UIButton 作为子视图添加到 UIImageView,则单击 UIButton 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UIButton + 子视图 = 无事件

将 UIButton 添加到子视图不起作用

将viewcontroller的视图添加为子视图后UIButton点击事件崩溃

Swift - 将目标添加到子视图内的 UIButton

以编程方式将 UIButton 添加到 UINavigationBar 的子视图,并且触摸事件未注册

uiButton 应始终作为 iPhone 中的顶视图