5

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

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

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

看起来很简单...

首先,我在 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];
}

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

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

[oneButton setBackgroundImage:anotherImage forState:UIControlStateSelected];

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

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

编辑:

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

首先,我将正在使用的 UIImage 放入名为 cardBackImage 的类属性中。

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

[cardButton setBackgroundImage:(oneCard.isFaceUp ? nil : self.cardBackImage) forState:UIControlStateNormal];

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

4

3 回答 3

0

我建议当按钮改变它的状态时简单地改变图像,即被触摸。我会写一个这样的方法:

- (void)swapBackgroundImagesOfButton:(UIButton *)button
{
    UIImage *normalImage = [button imageForState:UIControlStateNormal];
    UIImage *selectedImage = [button imageForState:UIControlStateSelected];

    [button setImage:selectedImage forState:UIControlStateNormal];
    [button setImage:normalImage forState:UIControlStateSelected];
}

然后,selected当您显示或隐藏图像时,您只需调用该方法,而不是设置按钮的状态。

于 2013-03-08T22:23:03.263 回答
0

为什么不尝试按钮的图像属性而不是背景图像?它会在图像存在时隐藏标题文本

UIButton *button;
[button setImage:[UIImage imageNamed:@"someImage"] forState:UIControlStateNormal];
于 2013-03-08T22:15:59.257 回答
0

这是一个更简单的解决方案,可让您根据状态仅使用情节提要设置 UIButton 图像和标题。在属性检查器中,您将按钮图像设置为默认状态,然后为所选状态设置按钮标题,并为图像添加空格字符,如您所见

在此处输入图像描述

然后您可以通过编程方式更改状态self.button.isSelected = true并查看图像变成文本

于 2020-01-26T09:05:42.063 回答