如何更改按钮的背景图像并立即更新?

时间:2010-06-24 17:34:55

标签: iphone objective-c image background uibutton

我开发了一款记忆游戏。当我点击一个按钮时,我想要切换背景。当我第二次点击卡片时,我希望背景切换一秒,然后返回到原始卡片(如果它不是正确的卡片)。但是直到我从方法(buttonPressed)返回时,按钮的背景才会改变。为什么它不会立即改变?请帮我! :)

以下是我正在使用的课程:

#import "Button.h"
#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>

@class ZogajAppDelegate;

@interface PairPlayPlayViewController : UIViewController <AVAudioPlayerDelegate> {
    ZogajAppDelegate *appDelegate;
    AVAudioPlayer *av;
    Boolean isPairActive;
    Button *firstButton;
    Button *secondButton;

}
@property (nonatomic, retain) AVAudioPlayer *av;
@property (nonatomic, retain) Button *firstButton;
@property (nonatomic, retain) Button *secondButton;
- (void)buttonPressed:(id)sender;
- (void)secondCard;

@end

和.m文件:

#import "PairPlayPlayViewController.h"
#import "ZogajAppDelegate.h"
#import "Button.h"
#import "AVFoundation/AVAudioPlayer.h"



@implementation PairPlayPlayViewController
@synthesize av, firstButton, secondButton;

/*
 // The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
        // Custom initialization
    }
    return self;
}
*/


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *newAudioFile = [[NSBundle mainBundle] pathForResource:@"double_card" ofType:@"mp3"];
    NSString *newAudioFile2 = [[NSBundle mainBundle] pathForResource:@"right_sound" ofType:@"mp3"];

    av = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:newAudioFile] error:NULL];
    [av prepareToPlay];
    [av initWithContentsOfURL:[NSURL fileURLWithPath:newAudioFile2] error:NULL];
    [av prepareToPlay];
    //av = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:newAudioFile] error:NULL];
    //[av prepareToPlay];
    isPairActive = FALSE;


    appDelegate = (ZogajAppDelegate *)[[UIApplication sharedApplication] delegate];
    int position;

    for(int i = 0; i < ((appDelegate.numberOfPairs*2)/5); i++){

        for (int j = 0; j<5 ;j++){


            Button *button = [[Button alloc] init];

            //Sätter bild nummer..
            position = (arc4random() % [appDelegate.cardsInPlay count]);
            button.picNumber = [[appDelegate.cardsInPlay objectAtIndex:position]intValue];
                        NSLog(@"%d", button.picNumber);
            [appDelegate.cardsInPlay removeObjectAtIndex:position];

            button.frame = CGRectMake( 3 + (65 * j), 5 + (65 * i), 55, 55);
            button.imageView.contentMode = UIViewContentModeScaleAspectFit;
            button.imageView.clipsToBounds = YES;
            [button setBackgroundImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
            [button addTarget:self action:@selector(buttonPressed:)
             forControlEvents:UIControlEventTouchUpInside];
            [self.view addSubview:button];
        }
    }
    for (int j = 0; j<((appDelegate.numberOfPairs*2) % 5) ;j++){


        Button *button = [[Button alloc] init];

        //Sätter bild nummer..
        position = (arc4random() % [appDelegate.cardsInPlay count]);
        button.picNumber = [[appDelegate.cardsInPlay objectAtIndex:position]intValue];
        NSLog(@"%d", button.picNumber);
        [appDelegate.cardsInPlay removeObjectAtIndex:position];

        button.frame = CGRectMake( 3 + (65 * j), 5 + (65 * ((appDelegate.numberOfPairs*2)/5) + 1), 55, 55);
        //button.imageView.contentMode = UIViewContentModeScaleAspectFit;
        //button.imageView.clipsToBounds = YES;
        [button setBackgroundImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(buttonPressed:)
         forControlEvents:UIControlEventAllTouchEvents];

        [self.view addSubview:button];
    }
}


/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/

-(void)buttonPressed:(id)sender {
    Button *button = [[Button alloc] init];
    button = sender;
    NSLog(@"%d och spela upp ljud", button.picNumber);
    NSString *newAudioFile = [[NSBundle mainBundle] pathForResource:@"double_card" ofType:@"mp3"];
    [av initWithContentsOfURL:[NSURL fileURLWithPath:newAudioFile] error:NULL];
    [av play];
    [button setBackgroundImage:[UIImage imageNamed:[NSString stringWithFormat:@"%d.png",button.picNumber]] forState:UIControlStateNormal];
    [self.view addSubview:button];
    [NSThread sleepForTimeInterval:1.0];

    if(isPairActive == FALSE){
        isPairActive = TRUE;
        firstButton = button;
    }
    else {
        secondButton = button;
        [self secondCard];
    }

    return;
}

- (void)secondCard {
    [NSThread sleepForTimeInterval:1.0];
    NSString *newAudioFile = [[NSBundle mainBundle] pathForResource:@"double_card" ofType:@"mp3"];
    isPairActive = FALSE;
    if([appDelegate.dictionary objectForKey:[NSString stringWithFormat:@"%d",secondButton.picNumber]] == [NSString stringWithFormat:@"%d",firstButton.picNumber]){
        NSString *newAudioFile2 = [[NSBundle mainBundle] pathForResource:@"right_sound" ofType:@"mp3"];
        [av initWithContentsOfURL:[NSURL fileURLWithPath:newAudioFile2] error:NULL];
        [av play];
    }
    else {
        [firstButton setBackgroundImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
        [secondButton setBackgroundImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
        [av initWithContentsOfURL:[NSURL fileURLWithPath:newAudioFile] error:NULL];
        [av play];
    }
    return;
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
    [av release];
    [firstButton release];
    [secondButton release];
}


@end

2 个答案:

答案 0 :(得分:2)

buttonPressed:更改后台,设置NSTimer给您回电,然后返回。在NSTimer回调中,将背景设置回您想要的内容。

在您提出要求时,绘图不会发生。这会给你带来可怕的表现。所有绘图都合并到运行循环的绘图部分。在您从此IBAction方法返回之前,您将无法达到该部分。

答案 1 :(得分:1)

如您所知,从方法返回后将更改图像。而已。

您必须从方法返回,因此您必须更改图像,执行执行您要执行的其余代码的选择器并从方法返回。

UIKit只能在主线程上运行,所以你必须从方法返回,阻止它,然后它将执行GUI操作。

编辑: 不要告诉NSThread睡觉,而是延迟执行选择。