所以我正在通过 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 ...就像我说的,不理想,但它有效。