UIButton - 默认状态下的图像,选定状态下的标题

pau*_*est 5 image objective-c title uibutton ios

所以我正在通过 iTunes U 完成 2013 年冬季斯坦福 iOS/Objective-C 课程的第二个作业,最后一部分让我发疯。

这是一款卡牌配对游戏。每张卡片在视图中都表示为一个 UIButton。当卡片对象面朝上时 UIButton 处于选中状态,当卡片面朝下时 UIButton 处于默认状态。找到匹配项后,也可以禁用卡片。

作业要求将图像放在卡片背面。换句话说,每个 UIButton 需要在默认状态下显示一个图像,但是当它处于选中或禁用状态时只显示 title 属性。

看起来很简单...

首先,我在 GUI(故事板)中尝试了这个,将背景图像设置为我的图像,然后确保选中和禁用状态都没有图像。这导致图像显示,但标题文本只是显示在图像上。一些搜索发现了这个原因:除非明确告知 UIButton 将所有其他 UIControlStates 默认为 UIControlStateNormal。

现在我一直试图让它以编程方式工作,但仍然没有运气。所有作为卡片的 UIButtons 都在一个 IBOutletCollection 中,它是一个 NSArray(cardButtons)。在 viewDidLoad 函数中,我有一个遍历所有按钮的 for 循环:

UIImage *cardBack = [UIImage makeSomeImage...];
for (UIButton *oneButton in cardButtons) {
[oneButton setBackgroundImage:cardBack forState:UIControlStateNormal];
[oneButton setBackgroundImage:nil forState:UIControlStateSelected];
}
Run Code Online (Sandbox Code Playgroud)

这仍然给我同样的问题。它绝对成功地将图像设置为默认状态,但是当我单击模拟器中的按钮时,图像仍然存在,而标题只是显示在它上面。

在 GUI 和编程中,我都可以得到一个不同的图像,以显示在选中和禁用状态下。我所要做的就是添加:

[oneButton setBackgroundImage:anotherImage forState:UIControlStateSelected];
Run Code Online (Sandbox Code Playgroud)

循环和所有按钮在选择时显示其他图像。

我不能做的,以及让我发疯的事情,是试图在选择时没有背景图像,以便 UIButton 只显示标题......

编辑:

虽然不是一个理想的解决方案(我认为使用 UIButton 中的 imageView 属性可能会有一些事情,但我不确定),但我已经想出了一种有点固定的感觉方法来完成这项工作。

首先,我将我正在使用的 UIImage 制作成一个名为 cardBackImage 的类属性。

然后,在每次对模型进行更改时循环遍历所有卡片按钮的 updateUI 函数中,我添加了以下代码行:

[cardButton setBackgroundImage:(oneCard.isFaceUp ? nil : self.cardBackImage) forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

因此,每次“翻转”卡片对象时,UIButton 都必须将 UIImage 加载或卸载到其实例变量中或从中卸载。Bleh...就像我说的,不理想,但它的工作原理。

Lit*_*T.V 0

为什么不尝试使用 image 属性而不是按钮的 backgroundImage ?当图像存在时它会隐藏标题文本

UIButton *button;
[button setImage:[UIImage imageNamed:@"someImage"] forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)