10

カードゲームの仕事をしています。カードの裏面に画像を表示し、カードの表面にカードの内容を表示する必要があります。背面に表示する画像を取得しましたが、選択したときに画像をクリアする方法がわかりません。(すべての run-this-code-when-it's-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]];
}
}

私が間違っていることについて何か考えはありますか?

4

7 に答える 7

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];
于 2013-03-09T00:04:56.317 に答える
6

あなたの問題はこれだと思います( のAppleドキュメントからsetImage:forState:):

一般に、状態のプロパティが指定されていない場合、デフォルトではUIControlStateNormal値が使用されます。値が設定されていない場合UIControlStateNormal、プロパティはデフォルトでシステム値になります。したがって、最低限、通常状態の値を設定する必要があります。

したがって、デフォルトのイメージが使用されるため、一部の状態のイメージを単純に設定解除することはできません。

この問題にはいくつかの解決策があります。

  1. 透明な画像ではなく、透けて見せたい状態に使用します。nil
  2. UIImageViewカードの背面画像に設定したサブビューをカードに付与します。カードが裏向きの場合、 を使用setHidden:してサブビューを表示します。カードが表向きの場合、 を使用setHidden:してサブビューを非表示にします。– addTarget:action:forControlEvents:カスタム ボタン クラス内のメソッドを使用して、カード バック サブビューを表示または非表示にするカスタム メソッドを登録することになるでしょう。

カードの前面をサブビューにも表示することで、オプション 2 をさらに一歩進めることができます。次に、これらの 2 つのサブビュー間のフリップ遷移を簡単にアニメートして、カードが押されたときに「反転」するようにすることができます

于 2013-02-05T03:58:21.483 に答える
1

パーティーに遅れて、MultiColour Pixel の回答に投票したり、コメントしたりすることはできません。私はここで新しく、評判がないからだと思います。しかし、これが最善かつ最も簡単な方法です。透明な画像や追加のビューは必要ありません。

OPと同じコースを取っていますが、同じ問題に遭遇しました。解決策は、ボタンが選択されている場合でも、選択されていない状態の画像を (nil に)設定することです。

UIImage *image = [UIImage imageNamed:@"cardback.png"];
// ...
[cardButton setImage:(card.isFaceUp ? nil : image) forState:UIControlStateNormal];

また、他の状態のイメージを設定することはありません。

于 2013-07-01T20:56:51.407 に答える
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];
        }
    }
}
于 2013-03-28T03:55:57.743 に答える
0

タグを使用できます:

例えば:

- (IBAction)btnClicked:(id)sender {

if([sender tag]==1){

//do something

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

//do something else
}

属性インスペクターに移動してボタンに異なるタグを設定し、デフォルト値の0を別の値に変更してください...

お役に立てれば...

于 2013-02-05T02:56:09.593 に答える