在Interface Builder中,如何将子视图添加到UIButton上?

19

就像我说的一样,我在Interface Builder中添加了一个UIButton,我想将UILabel、UIImageView作为按钮的子视图添加到上面,但是我无法在IB中添加任何对象。 有人知道该怎么做吗?非常感谢。

我可以使用代码来实现它,但我希望在IB中实现它,这样我就可以在任何需要的类中使用它。


这个不需要使用自定义的 UILabel 子类吗? - trojanfoe
4个回答

21

我以前做过类似的事情,是通过添加一个UIView(而不是UIButton),然后将UIButton和UILabel添加到UIView中。这样UIButton仍然可以被点击,同时您还有一个标签。您也可以像这样添加其他内容。


这似乎是最简单的方法,它不需要代码,并且不会影响布局,只是保存了额外的框架视图。对我来说,自定义按钮方法不起作用。 - Chris Conover
7
但是这个按钮没有显示出高亮状态。当用户点击它时,它看起来不像一个按钮,因为它没有高亮显示。有什么方法可以保持它的高亮状态?或者创造一种方式来让它高亮显示? - RedRoses
这种方法的另一个优点是您仍然可以将segue连接到它,并且所有内容都在界面构建器中。 - Nick T

5

通常我是这样做的

  1. 在Interface Builder中创建一个新的UIView,并将其设置为与您所需的按钮相同的大小和位置
  2. 将子视图添加到该UIView中
  3. 在Indentity Inspector中将UIView的类设置为UIButton

现在,您的UIView就像一个UIButton一样工作了


3
这里没有起作用。与UIButton相关联的操作从未被调用过。 - Colas
非常好,这是获胜者。可以像普通按钮一样启用/禁用,并且仅限IB。我猜Colas没有启用UserInteraction。 - Gordon Dove
这样做会产生一个副作用。Storyboard文件中的元素仍然保持为<view>...</view>,但是带有CustomClass="UIButton"。这意味着在Interface Builder中,ctrl点击-拖动不允许创建segue。我通过将<view>标签更改为<button>来验证这一点,这样就可以创建Segue,但是子视图不可见。 - Nick T
所以我刚刚添加了一个与UIView相同大小的按钮。一切正常。请参见顶部答案。 - Nick T
这对我也没用(我在点赞时有点过早)。我确保为UIView检查了“启用用户交互”,并取消了子视图的选中,但它仍然不会调用链接的操作。我使用Fogmeister的解决方案更加成功。 - Kal

1

不要使用 UIButton,而是将 UILabel 和 UIImageView 添加到 UIView 中,然后添加点击操作。

编辑 1:

很容易实现高亮颜色效果,使用以下代码:

- (void) onViewTap:(id)sender
{
    [UIView animateWithDuration:0.1
                          delay:0
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^{
                         _view.backgroundColor = [UIColor blueColor];
                     }

                     completion:^(BOOL finished){
                         _view.backgroundColor = [UIColor whiteColor];
                     }];

    //write tap actions below
}
- (void)viewDidLoad
{
    _view.userInteractionEnabled = YES;
    UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onViewTap:)];
    [_view addGestureRecognizer:tap];
}

谢谢Mhdali,那是个好主意。我以前试过,并发现我无法让UIView看起来像UIButton的状态一样,比如当我按下UIButton时,它会显示高亮颜色...而我真的想使用UIButton的属性。 - tinln

0
将您的UIButton定制为按钮,然后在其上添加UILabel,这样您就可以从UIButton的属性和操作中受益,希望这能帮到您。

抱歉,无法做到,还是谢谢你的帮助。我创建了一个新的.xib文件,在这个IB中,我只创建了一个UIButton,就像我说的那样,我想将UILabel和UIImageView作为UIButton的子视图。Mhdali和Fogmeister帮我解决了这个问题。 - tinln
3
这种方法对我无效 - IB仍然不允许我嵌套标签。(顺便说一下) - Chris Conover

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