【问题标题】:Click on UIButton Does Not Work if it's Added as Subview to UIImageView如果将 UIButton 作为子视图添加到 UIImageView,则单击 UIButton 不起作用
【发布时间】: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

标签: ios objective-c uiimageview uibutton addsubview


【解决方案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 稍后会进行动画处理。
      猜你喜欢
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多