所以我正在通过iTunes U完成2013年冬季斯坦福iOS / Objective-C课程的第二次任务,最后一部分让我发疯。
这是一款卡片匹配游戏。每张卡在视图中表示为UIButton。当卡片对象面朝上时,UIButton处于选中状态,当卡片面朝下时,UIButton处于默认状态。找到匹配项后,也可以禁用卡片。
作业要求在卡片背面放置图像。换句话说,每个UIButton都需要在处于默认状态时显示图像,但是当它处于选中或禁用状态时,它必须是title属性。
看起来很简单......
首先我在GUI(故事板)中尝试了这一点,将背景图像设置为我的图像,然后确保所选状态和禁用状态都没有图像。这导致图像显示,但随后标题文本显示在图像上。一些搜索找到了原因:除非明确告知,所以UIButton默认所有其他UIControlStates为UIControlStateNormal。
现在我一直在努力让这个以编程方式工作,但仍然没有运气。所有作为卡的UIButton都在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 ...就像我说的那样,并不理想,但它确实有效。
答案 0 :(得分:1)
我知道很久以前就发布了这个问题,但是我遇到了同样的问题,我发现了this answer到另一个帖子。
答案 1 :(得分:0)
为什么不尝试使用图像属性而不是按钮的backgroundImage?它会在图像存在时隐藏标题文本
UIButton *button;
[button setImage:[UIImage imageNamed:@"someImage"] forState:UIControlStateNormal];
答案 2 :(得分: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
状态。
答案 3 :(得分:0)