我正在开发纸牌游戏。我希望卡片背面显示图像,卡片前端显示卡片内容。我已经将图像显示在背面,但我无法弄清楚如何在选中时将其清除。 (所有run-this-code-when-selected-selected代码都在运行,所以我知道这不是一个不实际改变状态的问题。)这是我的代码:
-(void)updateUI {
for (UIButton *cardButton in self.cardButtons) {
Card *card = [self.game cardAtIndex:[self.cardButtons indexOfObject:cardButton]];
[cardButton setTitle:card.contents forState:UIControlStateSelected];
[cardButton setTitle:card.contents forState:UIControlStateSelected | UIControlStateDisabled];
[cardButton setImage:[UIImage imageNamed:@"cardback.png"] forState:UIControlStateNormal];
//I've tried various permutations of the following three lines, but the image never disappears.
[cardButton setImage:nil forState:UIControlStateSelected];
[cardButton setImage:nil forState:UIControlStateSelected | UIControlStateHighlighted];
[cardButton setImage:nil forState:UIControlStateNormal];
cardButton.selected = card.faceUp;
cardButton.alpha=(card.unplayable ? 0.3:1.0);
[self.scoreLabel setText:[NSString stringWithFormat:@"Score: %d",self.game.score]];
}
}
关于我做错了什么的想法?
答案 0 :(得分:6)
我猜你的问题是这个(来自setImage:forState:
的Apple文档):
通常,如果没有为状态指定属性,则默认使用
UIControlStateNormal
值。如果未设置UIControlStateNormal
值,则属性默认为系统值。因此,您至少应该设置正常状态的值。
因此,您不能简单地为某些状态取消设置图像,因为默认图像将被使用。
我看到了这个问题的几个解决方案:
nil
UIImageView
子视图,并将其设置为卡背图像。如果卡面朝下,请使用setHidden:
显示子视图。如果卡面朝上,请使用setHidden:
隐藏子视图。我可能会在您的自定义按钮类中使用– addTarget:action:forControlEvents:
方法来注册显示或隐藏卡片子视图的自定义方法。注意您可以通过在子视图中显示卡片的正面来轻松选择选项2,然后您可以轻松设置这两个子视图之间的翻转过渡动画,以便卡片按下时“翻转”。
答案 1 :(得分:6)
为其他状态创建透明图像的快捷方法,因为nil将默认为UIControlStateNormal的值,是分配和分配空图像:
UIImage *cardBackImage = [UIImage imageNamed:@"cardback.png"];
UIImage *cardFrontImage = [[UIImage alloc] init];
[cardButton setImage:cardBackImage forState:UIControlStateNormal];
[cardButton setImage:cardFrontImage forState:UIControlStateSelected];
[cardButton setImage:cardFrontImage forState:UIControlStateSelected|UIControlStateDisabled];
答案 2 :(得分:1)
如果你使用setBackgroundImage,那就没问题了。 这是我的代码。
- (void)updateUI
{
for (int i=0; i < self.cardButtons.count; i++) {
Card *card = [self.game cardAtIndex:i];
UIButton *cardButton = self.cardButtons[i];
[cardButton setTitle:card.contents forState:UIControlStateSelected];
[cardButton setTitle:card.contents forState:UIControlStateSelected|UIControlStateDisabled];
cardButton.selected = card.isFaceup;
cardButton.enabled = !card.isUnplayable;
cardButton.alpha = card.isUnplayable ? 0.3 : 1.0;
//handle flipcard backgroundimage changes;
UIImage *backgroundImage = (!cardButton.selected) ? [CardGameViewController cardBackgroundImage] : nil;
[cardButton setBackgroundImage:backgroundImage forState:UIControlStateNormal];
[self updateScoreLabel:self.game.score];
NSArray *matchCards = [self.game.matchCards lastObject];
if (matchCards) {
UIColor *color = [self getOneMatchColor];
for (NSNumber *matchCardIndex in matchCards) {
NSUInteger index = [matchCardIndex integerValue];
UIButton *matchCardButton = self.cardButtons[index];
if (color) matchCardButton.backgroundColor = color;
}
[self.game.matchCards removeLastObject];
}
}
}
答案 3 :(得分:0)
您可以使用标签:
例如:
- (IBAction)btnClicked:(id)sender {
if([sender tag]==1){
//do something
}
if([sender tag]==2){
//do something else
}
确保通过转到属性检查器为其设置不同的标签,并将默认值0更改为其他内容...
希望这会有所帮助......
答案 4 :(得分:0)
我发现最简单的解决方案是检查按钮是否被标记为已选中。如果没有,请应用背景图像,否则应用null UIImage。
答案 5 :(得分:0)
晚会,我不能投票通过MultiColour Pixel的回答,或评论它,我想因为我是新来的,没有任何声誉。但这确实是最好最简单的方法;无需透明图像或其他视图。
我现在采用相同的课程,作为OP,并遇到了同样的问题。解决方案是,当选择按钮时,您仍然将图像设置为 未选定 状态(为零):
UIImage *image = [UIImage imageNamed:@"cardback.png"];
// ...
[cardButton setImage:(card.isFaceUp ? nil : image) forState:UIControlStateNormal];
你永远不会为任何其他州设置图像。