私はobjective-cが初めてなので、ご容赦ください。2013 年冬のスタンフォード コース「iPhone/iPad のプログラミング」の演習として、いくつかのコードに取り組んでいます。基本的に、ボタンの UIControlStateNormal のボタンとして画像を設定する必要があります。残念ながら、まだスタック オーバーフローに画像を投稿することはできませんが、UIControlState 法線のボタンに画像を設定しようとすると、ボタンの画像があちこちに配置され、実際のボタンよりも大きくなります。他の UIControlState オプションの場合、画像付きのボタンは期待どおりに動作します。ボタンは全部で16個。
何が間違っているのかわかりません。「updateUI」というメソッド内のアプリケーションのViewControllerのforループにボタン画像を設定しています。コードは次のとおりです。
#import "CardGameViewController.h"
#import "PlayingCardDeck.h"
#import "CardMatchingGame.h"
@interface CardGameViewController ()
@property (weak, nonatomic) IBOutlet UILabel *scoreLabel;
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardButtons;
@property (weak, nonatomic) IBOutlet UILabel *flipsLabel;
@property (nonatomic) int flipCount;
@property (strong, nonatomic)CardMatchingGame* game;
@property (weak, nonatomic) IBOutlet UILabel *lastFlipLabel;
@property (weak, nonatomic) NSArray *lastFlip;
@property (weak, nonatomic) IBOutlet UISegmentedControl *gameControl;
@end
@implementation CardGameViewController
//lazy instantiation of the game
-(CardMatchingGame *)game
{
if(!_game)
{
_game = [[CardMatchingGame alloc] initWithCardCount:self.cardButtons.count usingDeck:[[PlayingCardDeck alloc]init]];
}
return _game;
}
//set the properties of the card buttons
-(void)setCardButtons:(NSArray *)cardButtons
{
_cardButtons = cardButtons;
[self updateUI];
}
//method to update the UI
-(void)updateUI
{
UIImage* cardback = [UIImage imageNamed:@"cardback.png"];//loads in the pic for the cardback
//go through all the card buttons and update
for(UIButton *cardButton in self.cardButtons)
{
Card* card = [self.game cardAtIndex:[self.cardButtons indexOfObject:cardButton]];//get the card
[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.2 : 1.0;
if(cardback)
{
[cardButton setImage:cardback forState:UIControlStateNormal];
}
[cardButton setTitle:@"" forState:UIControlStateNormal];
self.scoreLabel.text = [NSString stringWithFormat:@"Score: %d",self.game.score];
}
self.lastFlip = self.game.lastFlip;//get the result of the last flip from the model
[self.gameControl setTitle:@"2-Card \n Game" forSegmentAtIndex:0];
[self.gameControl setTitle:@"3-Card \n Game" forSegmentAtIndex:1];
}
- (IBAction)flipCard:(UIButton *)sender
{
[self.game flipCardAtIndex:[self.cardButtons indexOfObject:sender]];
self.flipCount++;
[self updateUI];
}
//setter for flipCount, update to the UI
-(void)setFlipCount:(int)flipCount
{
_flipCount = flipCount;
self.flipsLabel.text = [NSString stringWithFormat:@"Flips: %d",self.flipCount];
}
//setter for lastFlips, update to the UI
-(void)setLastFlip:(NSArray *)lastFlip
{
_lastFlip = lastFlip;
//append the last flips together to display the status
NSString* cardString = [[NSString alloc]init];
cardString = [self.lastFlip componentsJoinedByString:@" and "];
if(self.lastFlip.count==1 && ![cardString isEqualToString:@""])
{
self.lastFlipLabel.text = [NSString stringWithFormat:@"You just flipped the %@", cardString];
}
else if(self.lastFlip.count!=1 && self.game.lastMatch)
{
self.lastFlipLabel.text = [NSMutableString stringWithFormat:@"You just matched the %@ \n for %d points!",cardString, self.game.lastScore];
}
else if(self.lastFlip.count!=1 && !self.game.lastMatch)
{
self.lastFlipLabel.text = [NSString stringWithFormat:@"Oohh, sorry the %@ don't match. %d points for you!", cardString, self.game.lastScore];
}
}
//reset the game
- (IBAction)resetGame:(UIButton *)sender
{
self.game = [[CardMatchingGame alloc]initWithCardCount:self.cardButtons.count usingDeck:[[PlayingCardDeck alloc]init]];
[self.game reset];
self.lastFlipLabel.text = @"";//reset the text so it's blank
self.flipCount = 0;
[self updateUI];
}
@end