2013-03-04 114 views
0

我有一个cocos2d应用程序,它需要菜单中的UIImagePickerController。在iPad上,代码运行平稳,但是在iPhone上,当UIImagePickerController在屏幕上时会有巨大的性能损失 - 您需要按住按钮超过2秒才能注册为轻敲。任何提高响应时间的性能提示?在创建UIImagePickerController之前,我已经在CCDirector上调用'pause'和'stopAnimation'。UIImagePickerController在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]; 
} 

回答

0

我通过隐藏,当它完全由UIKit的视图( - 不仅限iPad在我的情况需要在iPhone上)隐藏在CCDirector查看固定的性能问题。类似这样的:

+ (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]; 
    } 
}