2013-03-04 2 views
0

J'ai une application cocos2d qui nécessite UIImagePickerController dans le menu. Sur l'iPad, le code est fluide, mais sur l'iPhone, il y a une énorme pénalité de performance lorsque le UIImagePickerController est à l'écran - vous devez maintenir les boutons enfoncés pendant plus de 2 secondes avant de vous enregistrer en tant que taps. Des conseils de performance pour améliorer le temps de réponse? J'appelle déjà 'pause' et 'stopAnimation' sur CCDirector avant de créer le UIImagePickerController.UIImagePickerController extrêmement lent dans cocos2d iOS

- (void)dismissViewControllerIfRequired { 
    if(_viewController != nil) { 
     [_viewController removeFromParentViewController]; 
     _viewController = nil; 
    } 
} 

- (void)dismissPickerIfRequiredAndAnimate:(BOOL)animated { 
    if (_picker != nil) { 
     [_picker dismissModalViewControllerAnimated:animated]; 
     [_picker.view removeFromSuperview]; 
     _picker = nil; 

     [[CCDirector sharedDirector] startAnimation]; 
     [[CCDirector sharedDirector] resume]; 
    } 
} 

- (void)dismissPopoverIfRequiredAndAnimate:(BOOL)animated { 
    if (_popover != nil) { 
     [_popover dismissPopoverAnimated:animated]; 
     _popover = nil; 
    } 
} 

- (void)showPhotoLibrary { 
    [self dismissPickerIfRequiredAndAnimate:NO]; 
    [self dismissViewControllerIfRequired]; 
    [self dismissPopoverIfRequiredAndAnimate:NO]; 

    CCDirector * director = [CCDirector sharedDirector]; 
    [director pause]; 
    [director stopAnimation]; 

    _picker = [[UIImagePickerController alloc] init]; 
    _picker.delegate = self; 
    _picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    _picker.wantsFullScreenLayout = YES; 
    _picker.view.userInteractionEnabled = YES; 

    if([CCDirector sharedDirector].currentDeviceIsIPad) { 
     _popover = [[UIPopoverController alloc] initWithContentViewController:_picker]; 
     [_popover setDelegate:self]; 

     CGSize winsize = [[CCDirector sharedDirector] winSize]; 
     [_popover setPopoverContentSize:CGSizeMake(320, winsize.height) animated:NO]; 

     CGRect r = CGRectMake(20,20,10,10); 
     r.origin = [[CCDirector sharedDirector] convertToGL:r.origin]; 
     [_popover presentPopoverFromRect:r inView:[CCDirector sharedDirector].view permittedArrowDirections:UIPopoverArrowDirectionDown animated:NO]; 
    } else { 

     _viewController = [[UIViewController alloc] init]; 
     _viewController.view.userInteractionEnabled = YES; 
     [director.view addSubview:_viewController.view]; 
     [_viewController presentModalViewController:_picker animated:NO]; 
    } 

} 

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 
    [self dismissPickerIfRequiredAndAnimate:YES]; 
    [self dismissViewControllerIfRequired]; 
    [self dismissPopoverIfRequiredAndAnimate:YES]; 
} 


- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { 
    [self dismissPickerIfRequiredAndAnimate:YES]; 
    [self dismissViewControllerIfRequired]; 
} 



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

    UIImage * pickedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 

    if(pickedImage == nil) { 
     printf("picked image was nil...\n"); 
    } else { 
     printf("picked image size: %f, %f\n", pickedImage.size.width, pickedImage.size.height); 
    } 

    [self dismissPickerIfRequiredAndAnimate:YES]; 
    [self dismissPopoverIfRequiredAndAnimate:YES]; 
} 

Répondre

0

Je fixe le problème de performances en se cachant la vue CCDirector quand il est complètement caché par la vue UIKit (nécessaire uniquement sur iPhone dans mon cas - pas iPad). Quelque chose comme ceci:

+ (void)hideDirector { 
    CCDirector * director = [CCDirector sharedDirector]; 

    if(!director.view.hidden) { 
     [director purgeCachedData]; //optional 
     [director pause]; 
     [director stopAnimation]; 

     [director.view setHidden:YES]; 
    } 
} 


+ (void)showDirector { 
    CCDirector * director = [CCDirector sharedDirector]; 

    if(director.view.hidden) { 
     [director.view setHidden:NO]; 

     [director stopAnimation]; 
     [director resume]; 
     [director startAnimation]; 
    } 
} 
Questions connexes