Cocoa touch 如何向UIButton添加第二个UILabel,可根据uicontrol状态配置

Cocoa touch 如何向UIButton添加第二个UILabel,可根据uicontrol状态配置,cocoa-touch,uibutton,uilabel,calayer,drawrect,Cocoa Touch,Uibutton,Uilabel,Calayer,Drawrect,我想用不同的字体和颜色显示2个字符串(在按钮的不同位置)(我正在使用按钮的setTitle作为一个,我需要另一个),并且必须根据当前UIControlState(如颜色)更改某些属性 因此,我正在寻找向ui按钮添加第二个标签的最佳方法。 我需要根据UIControlState配置标签(例如,我希望uicontrolstatemormal和UIControleStateHighlighted使用不同的颜色) 我尝试了以下方法: 子类aUIButton并使用drawRect:虽然不推荐(我现在明白

我想用不同的字体和颜色显示2个字符串(在按钮的不同位置)(我正在使用按钮的
setTitle
作为一个,我需要另一个),并且必须根据当前
UIControlState
(如颜色)更改某些属性

因此,我正在寻找向
ui按钮添加第二个标签的最佳方法。
我需要根据
UIControlState
配置标签(例如,我希望
uicontrolstatemormal
UIControleStateHighlighted
使用不同的颜色)

我尝试了以下方法:

  • 子类a
    UIButton
    并使用
    drawRect
    :虽然不推荐(我现在明白了原因),但我认为这是不可能的,看起来按钮的
    drawRect
    方法被调用了(在我的子类之一之后),即使我不调用super
  • 创建一个新的
    UILabel
    并将其作为
    子视图添加到我的按钮:这工作得很好,只是当按钮的
    UIControlState
    更改时我不知道如何更改颜色
  • 创建一个新层并使用
    drawLayer
    :我不知道如何在每次按钮状态更改时调用
    drawLayer
    方法(我的
    drawLayer
    仅被调用一次,当我将我的层添加到按钮后使用
    setNeedsDisplay
    时)
有没有其他方法可以实现我想做的事情,或者这些解决方案中的一个可能会起作用(稍作调整)


谢谢

第二种方法很好。只需添加两个目标:首先使用“所有触摸事件”更新到“正常状态”目标。使用“触地”事件对“突出显示”进行第二次更新


如果状态不仅仅是通过触摸改变的,并且希望更普遍地处理这个问题,我建议使用多线程。您真正需要的是在初始化所有这些元素时调用performSelectorInBackground(选择器根据按钮状态更新标签),然后在“更新标签”方法的末尾再次调用相同的performSelectorInBackground,创建一个无限循环。

好的,我想我找到了一个有效的解决方案(至少对于我的问题)

我正在对
UIButton
类进行子类化(它对我有效,因为我使用的是自定义绘制的按钮),并且我覆盖了
titlelectforcontentrect
方法,每当必须显示标题时(包括状态更改后,显示前)都会调用该方法


我在按钮视图中添加了一个
ui标签
,以显示我想要的第二个字符串,在
titleRectForContentRect
期间,我计算标签的正确
框架
位置,根据按钮的状态(
self.state
)更新标签的文本字体和颜色,这就是我所需要的。

对于我试图做的简单事情来说似乎有点复杂,但我想这是因为UIButton是一个不容易子类化的类。如果没有其他结果,我会看看这个解决方案。