如何删除某些状态的UIButton图像?

时间:2013-02-05 02:13:20

标签: ios uibutton uiimage cs193p

我正在开发纸牌游戏。我希望卡片背面显示图像,卡片前端显示卡片内容。我已经将图像显示在背面,但我无法弄清楚如何在选中时将其清除。 (所有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]];
}
}

关于我做错了什么的想法?

6 个答案:

答案 0 :(得分:6)

我猜你的问题是这个(来自setImage:forState:的Apple文档):

  

通常,如果没有为状态指定属性,则默认使用UIControlStateNormal值。如果未设置UIControlStateNormal值,则属性默认为系统值。因此,您至少应该设置正常状态的值。

因此,您不能简单地为某些状态取消设置图像,因为默认图像将被使用。

我看到了这个问题的几个解决方案:

  1. 对要显示的状态使用透明图像而不是nil
  2. 为您的卡片设置一个UIImageView子视图,并将其设置为卡背图像。如果卡面朝下,请使用setHidden:显示子视图。如果卡面朝上,请使用setHidden:隐藏子视图。我可能会在您的自定义按钮类中使用– addTarget:action:forControlEvents:方法来注册显示或隐藏卡片子视图的自定义方法。
  3. 注意您可以通过在子视图中显示卡片的正面来轻松选择选项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];

你永远不会为任何其他州设置图像。