user513064
user513064

Reputation:

UIImagePickerController only working once

I am using UIImagePickerController for users to select the background in my Cocos2D game. It works the first time you use it, but if you try to change the background again the picker will show up, but when you select the image the background will stay the same.

This is my code:

- (void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSArray *TouchesA = touches.allObjects;

    for (int i = 0; i < TouchesA.count; i++) {


        CGPoint touchLocation = [self convertTouchToNodeSpace:[TouchesA objectAtIndex:i]];

        CGRect rect = CGRectMake(touchLocation.x, touchLocation.y, 1, 1);

        if(CGRectIntersectsRect(rect, infoButton.boundingBox))
        {
            [self pickPhoto:UIImagePickerControllerSourceTypeSavedPhotosAlbum];
        }
    }
}

-(void)pickPhoto:(UIImagePickerControllerSourceType)sourceType{

    UIImagePickerController *picker = [[UIImagePickerController alloc]init];
    picker.delegate = self;
    picker.sourceType = sourceType;
    //picker.wantsFullScreenLayout = YES;
    //[picker presentModalViewController:picker animated:YES];

    [[[CCDirector sharedDirector] openGLView] addSubview:picker.view];

}

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{

    [picker dismissModalViewControllerAnimated:YES];
    [picker.view removeFromSuperview];
    [picker release];
}

-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info{

    newImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

    [picker dismissModalViewControllerAnimated:YES];
    [picker.view removeFromSuperview];
    [picker release];



    CCSprite *imageFromPicker = [CCSprite spriteWithCGImage:newImage.CGImage key:@"ImageFromPicker"];

    Background = imageFromPicker;

    int SSw = [CCDirector sharedDirector].winSize.width;
    int SSh = [CCDirector sharedDirector].winSize.height;

    Background.position = ccp(SSw/2, SSh/2);

    Background.scaleX = SSw / Background.textureRect.size.width;
    Background.scaleY = SSh / Background.textureRect.size.height;

    [[self children] removeObjectAtIndex: 0];
    [[self children] insertObject:Background atIndex:0];


}

How can I fix this?

EDIT:

@interface HelloWorldLayer : CCLayer <UIImagePickerControllerDelegate, 

UINavigationControllerDelegate>
{
    CCSprite *infoButton;
    CCSprite *Background;
    UIImage *newImage;
}



-(id) init
{
    if( (self=[super init])) {

        self.isTouchEnabled = true;
        [[CCDirector sharedDirector].openGLView setMultipleTouchEnabled:YES];


        int SSw = [CCDirector sharedDirector].winSize.width;
        int SSh = [CCDirector sharedDirector].winSize.height;

        Background = [CCSprite spriteWithFile:@"B.jpg"];    

        Background.position = ccp(SSw/2, SSh/2);

        Background.scaleX = SSw / Background.textureRect.size.width;
        Background.scaleY = SSh / Background.textureRect.size.height;



        infoButton = [CCSprite spriteWithFile:@"info.png"];
        infoButton.position = ccp(SSw - 15, 15);

        [self addChild:Background];
        [self addChild:infoButton];

        [self schedule:@selector(nextFrame:)];

    }
    return self;
}

Upvotes: 0

Views: 379

Answers (2)

cyx
cyx

Reputation: 1723

I've had the same problem

Check this line:

CCSprite *imageFromPicker = [CCSprite spriteWithCGImage:newImage.CGImage key:@"ImageFromPicker"];

and try to replace it with:

// resize image
UIImage* image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

// add current shot
CCTexture2D *texture2D = [[[CCTexture2D alloc] initWithImage:image] autorelease]; // this is new
CCSprite *sprite = [CCSprite spriteWithTexture:texture2D]; // this is new

also look here: http://www.cocos2d-iphone.org/forum/topic/30259?replies=8#post-149117

Hope this helps.

Upvotes: 1

donkim
donkim

Reputation: 13137

How about trying something like:

[Background removeFromParentAndCleanup:YES];

CCSprite *imageFromPicker = [CCSprite spriteWithCGImage:newImage.CGImage key:@"ImageFromPicker"];

Background = imageFromPicker;

int SSw = [CCDirector sharedDirector].winSize.width;
int SSh = [CCDirector sharedDirector].winSize.height;

Background.position = ccp(SSw/2, SSh/2);

Background.scaleX = SSw / Background.textureRect.size.width;
Background.scaleY = SSh / Background.textureRect.size.height;

[[self children] insertObject:Background atIndex:0];

Upvotes: 0

Related Questions