我有一个在菜单中需要 UIImagePickerController 的 cocos2d 应用程序。在 iPad 上,代码运行流畅,但在 iPhone 上,当 UIImagePickerController 出现在屏幕上时,会出现巨大的性能损失——您需要按住按钮超过 2 秒,然后才能将它们注册为点击。有什么提高响应时间的性能提示吗?在创建 UIImagePickerController 之前,我已经在 CCDirector 上调用了“暂停”和“停止动画”。
- (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];
}