Удалить UIImagePickerController из Cocos2D - PullRequest
0 голосов
/ 20 июля 2011

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

Но когда я нажимаю на кнопку, я получаю ошибки SIGABRT или BAD EXE в зависимости от того, использую я [[[CCDirector sharedDirector] openGLView] sendSubviewToBack:uip.view]; или [uip.view removeFromSuperview];

-(void) displayCamera
{

uip = [[[UIImagePickerController alloc] init] autorelease];
uip.sourceType = UIImagePickerControllerSourceTypeCamera;
uip.showsCameraControls = NO;
uip.toolbarHidden = YES;
uip.navigationBarHidden = YES;
uip.wantsFullScreenLayout = YES;

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

UIButton *arrowButton = [UIButton buttonWithType:UIButtonTypeCustom];
[arrowButton addTarget:self 
           action:@selector(arrowButtonClicked:)
 forControlEvents:UIControlEventTouchUpInside];

UIImage *imgNormal = [UIImage imageNamed:@"btn_next_norm.png"];
[arrowButton setImage:imgNormal forState:UIControlStateNormal];

UIImage *imgPressed = [UIImage imageNamed:@"btn_next_pressed.png"];
[arrowButton setImage:imgPressed forState:UIControlStateHighlighted];

arrowButton.frame = CGRectMake(screenSize.width - 48.0, screenSize.height - 37.0, 48.0, 37.0);

[[[CCDirector sharedDirector] openGLView] addSubview:arrowButton];
}

-(void)arrowButtonClicked:(id)sender
{
 // close / hide camera 

[[[CCDirector sharedDirector] openGLView] sendSubviewToBack:uip.view];

// or maybe [uip.view removeFromSuperview];

// and then go to another scene

LoadingScene* scene = [LoadingScene sceneWithTargetScene:TargetSceneEndExperienceScene];
[[CCDirector sharedDirector] replaceScene:scene];    
}

1 Ответ

1 голос
/ 20 июля 2011

Я считаю, что проблема заключается в следующей строке:

uip = [[[UIImagePickerController alloc] init] autorelease];

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

-(void) displayCamera
{

uip = [[UIImagePickerController alloc] init];  // Don't autorelease it here
uip.sourceType = UIImagePickerControllerSourceTypeCamera;
uip.showsCameraControls = NO;
uip.toolbarHidden = YES;
uip.navigationBarHidden = YES;
uip.wantsFullScreenLayout = YES;

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

UIButton *arrowButton = [UIButton buttonWithType:UIButtonTypeCustom];
[arrowButton addTarget:self 
           action:@selector(arrowButtonClicked:)
 forControlEvents:UIControlEventTouchUpInside];

UIImage *imgNormal = [UIImage imageNamed:@"btn_next_norm.png"];
[arrowButton setImage:imgNormal forState:UIControlStateNormal];

UIImage *imgPressed = [UIImage imageNamed:@"btn_next_pressed.png"];
[arrowButton setImage:imgPressed forState:UIControlStateHighlighted];

arrowButton.frame = CGRectMake(screenSize.width - 48.0, screenSize.height - 37.0, 48.0, 37.0);

[[[CCDirector sharedDirector] openGLView] addSubview:arrowButton];
}

-(void)arrowButtonClicked:(id)sender
{
 // close / hide camera 

[uip.view removeFromSuperview];
[uip release];  // Release here
uip = nil;

// and then go to another scene

LoadingScene* scene = [LoadingScene sceneWithTargetScene:TargetSceneEndExperienceScene];
[[CCDirector sharedDirector] replaceScene:scene];    
}
...