Ios 如何删除UIButton';美国在某些州的形象如何?

Ios 如何删除UIButton';美国在某些州的形象如何?,ios,uibutton,uiimage,cs193p,Ios,Uibutton,Uiimage,Cs193p,我正在做纸牌游戏。我希望卡片背面显示图像,卡片正面显示卡片内容。我已经在背面显示了图像,但我不知道如何在选中时清除它。(所有这些代码都是在选定代码运行时运行的,因此我知道这不是一个不实际更改状态的问题。)以下是我的代码: -(void)updateUI { for (UIButton *cardButton in self.cardButtons) { Card *card = [self.game cardAtIndex:[self.cardButtons indexOfObject:

我正在做纸牌游戏。我希望卡片背面显示图像,卡片正面显示卡片内容。我已经在背面显示了图像,但我不知道如何在选中时清除它。(所有这些代码都是在选定代码运行时运行的,因此我知道这不是一个不实际更改状态的问题。)以下是我的代码:

-(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]];
}
}
关于我做错了什么有什么想法吗?

您可以使用标签:

例如:

- (IBAction)btnClicked:(id)sender {

if([sender tag]==1){

//do something

}
if([sender tag]==2){

//do something else
}
确保通过转到属性检查器为按钮设置不同的标记,并将默认值0更改为其他值


希望这有帮助……

我猜你的问题是这样的(从苹果的
setImage:forState:
文档中):

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

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

我看到了一些解决这个问题的方法:

  • 对要显示的状态使用透明图像,而不是
    nil
  • 为您的卡提供一个设置为卡背面图像的
    UIImageView
    子视图。如果卡正面朝下,请使用
    setHidden:
    显示子视图。如果卡正面朝上,请使用
    setHidden:
    隐藏子视图。我可能会在自定义按钮类中使用
    –addTarget:action:forControlEvents:
    方法来注册一个显示或隐藏卡片背面子视图的自定义方法

  • 注意通过在子视图中显示卡的正面,您可以轻松地将选项2向前推进一步,然后您可以轻松地在这两个子视图之间设置翻转过渡动画,以便卡在按下时“翻转”。

    一种为其他状态创建透明图像的快速方法,由于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];
    

    如果您使用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];
            }
        }
    }
    
    -(void)updateUI
    {
    对于(int i=0;i
    我找到的最简单的解决方案是检查按钮是否被标记为选中。如果没有,应用背景图像,否则应用空UIImage。

    晚会迟到了,我不能投票支持Multicolor Pixel的答案,也不能对其发表评论,我猜是因为我是新来的,没有任何声誉。但这确实是最好、最简单的方法;不需要透明图像或其他视图

    我现在学的是和OP一样的课程,遇到了同样的问题。解决方案是,当选择按钮时,仍将图像设置为未选择的状态(为零):


    而且您从未为任何其他状态设置过图像。

    谢谢,但问题不在于图像被删除或没有被错误的按钮删除,而是图像没有被任何按钮删除,无论其状态如何(Paul Hegarty真棒:我从未见过
    UIImage*cardFrontImage=[UIImage alloc];
    为什么我们没有进行初始化?没有错吗?我是初学者,你能解释一下吗?谢谢。为什么我们不能这样做:
    UIImage*cardFrontImage=nil;
    它也帮助了我。我认为
    UIImage*cardFrontImage=[UIImage alloc]init]
    是一种正确的方法。顺便说一句,Paul Hegarty多次表示,alloc从未在没有init的情况下使用。
    UIImage*cardfronimage=nil;
    不能使用,因为它与
    [cardButton setImage:nil forState:UIControlStateSelected]相同;
    和nil值默认为UIControlStateNormal使用的值。通过给它一个实例化的UIImage,它将“绘制”此图像,即使它正在绘制一个没有图像数据的图像。
    UIImage *image = [UIImage imageNamed:@"cardback.png"];
    // ...
    [cardButton setImage:(card.isFaceUp ? nil : image) forState:UIControlStateNormal];