将子视图添加到UIButton

46
我正在尝试向一个UIButton添加子视图,目前这样做是可以的。但是,一旦我添加了子视图,按钮就不能再点击了。
我使用以下代码:
UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(column*100+24, row*80+10, 64, 64);
[button addSubview:asyncImage];
[button addSubview:price];
[button addTarget:self 
           action:@selector(buttonClicked:) 
 forControlEvents:UIControlEventTouchUpInside];

如果我删除这两个addSubview:方法,该按钮就可以正常工作。如果有人知道如何修复它,那就太好了!

7个回答

83
我找到了一个快速解决方案。我需要将asyncImageView设置为以下内容:
asyncImage.userInteractionEnabled = NO;
asyncImage.exclusiveTouch = NO;

之后,它就工作了!


如果可能的话,我会在两天内回答我的问题。 - Jos
我对于'userInteractionEnabled'属性的想法恰好相反,我认为将其设置为“YES”实际上应该捕获按钮子视图上的点击事件。很棒的答案! - Shvalb
2
对我来说,只需简单地设置 userInteractionEnabled = false 就可以解决问题。 - Nicholas Allio

3

尝试使用以下代码:

[UIButton buttonWithType:UIButtonTypeCustom];

而不是:

[UIButton buttonWithType:UIButtonControlType];

这样可以更好地实现相关的IT技术。


那不起作用,它给了我一个错误,无法识别UIButtonControlType。 - Jos
哦,那么尝试将用户交互设置为启用,像这样[YOUR BUTTON setUserInteractionEnabled:// bool,对于您来说是YES。 - user842059
我尝试了对于两个子视图(价格和异步图像)以及按钮进行此操作,但并没有产生任何区别... - Jos

2
重要的是确保将userInteractionEnabled设置为NO。幸运的是,对于UIImageViewUILabel(也许适用于其他UIView的子类,但这些是添加到按钮中最常见的子视图),由于默认情况下这些类别的标志已经设置为NO,因此它们可以立即使用。不幸的是,在UIView中,它被默认设置为YES,因此在这种情况下,请确保更改它。不需要去修改任何其他标志。问题的本质是很多人不知道这个标志的默认值在子类中是不同的。

@benhi,很酷。如果你想让我帮忙 - 更多的细节会更有帮助 :P - Julian
@property (weak, nonatomic) IBOutlet UIButton *popular;popular = [UIButton buttonWithType:UIButtonTypeCustom];UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, popular.frame.size.width, popular.frame.size.height)];label.text = @"按钮标题"; label.textColor = [UIColor redColor]; label.userInteractionEnabled = NO; [popular addSubview:label]; - benhi
它无法检测触摸或者有什么不起作用的吗? - Julian
你给它哪些框架,宽度和高度可能是0吗?你确定此时按钮已经初始化了吗?顺便说一下,不显示的标签有点离题 ;) 因为问题在于添加的子视图禁用了触摸。 - Julian
我在Storyboard中创建了按钮。 - benhi
显示剩余3条评论

1

你尝试过放置:

[asyncImage setUserInteractionEnabled:YES];

你也尝试使用其他视图了吗?[price setUserInteractionEnabled:YES]; - Matteo Alessani

1
在相同的情况下,我会执行以下操作: 继承UIButton并将按钮的所有标签和imageview添加到self中,最后将新按钮作为最后一个子视图放入视图中,并将self按钮的目标添加到此最后一个按钮(还将backgroundColor设置为透明)。现在它将是可点击的并且可以正常工作。

我有点明白这个想法,但不确定需要做什么。你有一个简短的例子吗?谢谢! - Jos
我主要不明白你所说的让动作从UIButton继承,并将其设置为self。如果我使用self.button,它会给我一个错误。谢谢! - Jos
哇,好的!我会试试看的!谢谢。 - Jos

1
我在子视图按钮中添加了一个标签。 很长一段时间以来,我一直在寻找为什么我的按钮文本无法点击的原因。这个帖子提供了解决方案:
myLable.isUserInteractionEnabled = false 

0
在Swift中,测试一下你的UIButton是否被阻止。
uibtn.userInteractionEnabled = false
uibtn.exclusiveTouch = false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接