themantalope
themantalope

Reputation: 1040

Objective-C setImage forState:UIControlStateNormal not formatting image properly

I'm new to objective-c so please bear with me. I'm working on some code as an exercise, from the Stanford course "Programming for the iPhone/iPad" in the winter of 2013. Basically what I need to do is set an image as a button for the button's UIControlStateNormal. Unfortunately, I can't post pictures yet to stack overflow, but when I try to set the image on the button for the UIControlState normal, the images for the buttons are all over the place and are larger than the actual buttons. For the other UIControlState options, the buttons with the image behave as expected. There are sixteen buttons in total.

I'm not sure what I'm doing wrong. I have the button images being set in a for loop in the application's ViewController within the method called "updateUI". Here is the code:

#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

Upvotes: 1

Views: 1195

Answers (1)

DogCoffee
DogCoffee

Reputation: 19966

Try turning off auto layout - in the right hand panel of your storyboard view in Xcode.

Upvotes: 1

Related Questions