Как изменить фоновое изображение кнопки и мгновенно обновить его? - PullRequest
0 голосов
/ 24 июня 2010

Я занимаюсь разработкой игры на память.Когда я нажимаю на кнопку, я хочу, чтобы фон переключился.Когда я нажимаю на карту во второй раз, я хочу, чтобы фон переключался на секунду, а затем возвращался к оригиналу (если это была не та карта).Но фон кнопок не меняется, пока я не вернусь из метода (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 ]

2 голосов
/ 24 июня 2010

В buttonPressed: измените фон, установите NSTimer, чтобы он перезвонил вам, и вернитесь.В обратном вызове NSTimer установите фон обратно на то, что вы хотите.

Рисование не происходит в тот момент, когда вы его просите.Это даст вам ужасную производительность.Все чертежи объединяются в часть рисования цикла выполнения.Вы не доберетесь до этой части, пока не вернетесь к этому методу IBAction.

1 голос
/ 05 ноября 2013

Как вы уже знаете, изображение будет изменено после возврата из метода.Вот и все.

Вы должны вернуться из метода, поэтому вы должны изменить изображение, выполнить селектор, который выполняет оставшуюся часть кода, который вы хотите выполнить, и вернуться из метода.

UIKit может работать тольков главном потоке, поэтому вы должны вернуться из метода, который блокирует его, и тогда он выполнит манипуляции с графическим интерфейсом.

РЕДАКТИРОВАТЬ: вместо того, чтобы сказать NSThread в спящий режим, выполните селектор с задержкой.

...