【发布时间】:2013-02-24 13:55:14
【问题描述】:
所以我正在通过 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...就像我说的,不理想,但它有效。
【问题讨论】:
-
是你为选中状态分配1像素透明图片的好办法吗?
-
这完全有可能,但我试图找出一些我可以在 XCode 中做的事情,而无需启动 Photoshop 或 GIMP。
标签: ios objective-c image uibutton title