我有一个在菜单中需要 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];
}