如果将 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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
将viewcontroller的视图添加为子视图后UIButton点击事件崩溃