我正在使用以下代码显示UIImagePickerController来拍照:
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setDelegate:self];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[self presentViewController:imagePicker animated:YES completion:nil];
注意:self是一个嵌入在Container视图中的UIViewController,它本身也参与了UINavigationController
我还实现了以下方法:
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
[self.imgProfile setImage:image];
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[self dismissViewControllerAnimated:YES completion:nil];
}
当我选择拍摄的图片或取消它时,UIImagePickerController会消失,但主视图也会消失!淡出黑色。
我在仅限iPad的应用上编写iOS7代码,以防它与它有任何关系。
这是一个显示问题的视频。请原谅模糊,但它是在NDA下。
答案 0 :(得分:13)
我在iOS7下遇到了同样的问题,我发现的唯一解决办法如下:
从VC中呈现选择器时;
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];
[self addChildViewController:picker] ;
[picker didMoveToParentViewController:self] ;
[self.view addSubview:picker.view] ;
然后,当处理选择器委托 - 而不是dismissModal时,使用;
[picker.view removeFromSuperview] ;
[picker removeFromParentViewController] ;
你失去的只是动画的礼物/解雇 - 除此之外,一切都应该好。
答案 1 :(得分:3)
您应该关闭 选择器 ,而不是您的视图(自我) 并确保添加这些:
<UINavigationControllerDelegate, UIImagePickerControllerDelegate>
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
self.imageView.image = chosenImage;
[picker dismissViewControllerAnimated:YES completion:NULL];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[picker dismissViewControllerAnimated:YES completion:NULL];
}
答案 2 :(得分:3)
尝试将您的图片选择器.modalPresentationStyle
设置为.OverCurrentContext
或.OverFullScreen
:
可替换地:
viewController.definesPresentationContext = true
imagePicker.modalPresentationStyle = .CurrentContext OR .FullScreen
关键是这两个属性之间的关系需要保留:如果false
然后是.OverCurrentContext
,如果是true
那么.CurrentContext
在我的情况下,我的视图控制器的.definesPresentationContext
默认为false,所以我使用了第一个选项。
答案 3 :(得分:0)
建议您在将相机胶卷打开到iPad时使用UIPopOver 所以试一试希望它可以帮助你。
#pragma mark
#pragma mark - Image Picker
-(IBAction)onClickTakePhoto:(id)sender
{
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.delegate = self;
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePickerController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:imagePickerController.sourceType];
imagePickerController.allowsEditing = YES;
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
[self presentViewController:imagePickerController animated:YES completion:nil];
} else {
[self presentModalViewController:imagePickerController animated:YES];
}
[imagePickerController release];
}
}
-(IBAction)onClickChooseFromLibrary:(id)sender
{
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
{
imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePickerController.delegate = self;
imagePickerController.allowsEditing = YES;
imagePickerController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:imagePickerController.sourceType];
popoverController= [[UIPopoverController alloc]
initWithContentViewController:imagePickerController];
[popoverController presentPopoverFromRect:btnLibrary.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
}
#pragma mark
#pragma mark - UIImagePickerDelegate
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])
{
[self dismissViewControllerAnimated:YES completion:nil];
} else {
[self dismissModalViewControllerAnimated:YES];
}
[popoverController dismissPopoverAnimated:YES];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])
{
[self dismissViewControllerAnimated:YES completion:nil];
} else {
[self dismissModalViewControllerAnimated:YES];
}
[popoverController dismissPopoverAnimated:YES];
UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
[userImage setLocalImage:image];
}
答案 4 :(得分:0)
当UIImagePickerController正式解散时,它会在导航堆栈中紧跟VC后面的任何VC上触发以下方法:
- viewWillAppear
- viewDidAppear
- viewDidLayoutSubviews
a bunch of other methods having to do with basic VC lifecycle.
在我的情况下,我没有使用presentViewController:
方法呈现最顶层的VC。我将它实例化为根VC的一个孩子并做一些自定义动画。我在-viewDidLayoutSubviews
方法中完成了大部分工作。这项工作的一部分是指定我的孩子的框架在屏幕外的位置。
所以,当我将我的孩子视图动画到屏幕上,呈现相机,然后解散它时,应用程序最终触发了我的rootVC上的-viewDidLayoutSubviews
,这将我的childVC移出屏幕。
所以,我想答案是确保初始VC设置代码只能触发一次(在放置所有内容之前使用类似Bool setupHasAlreadyHappenedOnce
的内容)。
答案 5 :(得分:0)
当我尝试从UIContainerView中呈现UIImagePickerController时,我有类似但不完全正确的问题。
问题是解雇UIImagePickerController改变了UIContainerView中的导航(调整大小到全屏)。
解决方案是从UIContainerView的PARENT视图控制器中呈现UIImagePickerController,现在一切都运行良好。
答案 6 :(得分:0)
仅仅是为了注意,UIImagePickerController的委托是&#34;双委托&#34;,它还委托UINavigationControllerDelegate。请参阅下面的代码。
@property(nullable,nonatomic,weak) id <UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate;
因此,检查self
是否也实现UINavigationControllerDelegate
,并解除父视图控制器,如下所示。
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
NSMutableArray *stack = [navigationController.viewControllers mutableCopy];
if (stack.count >= 2) {
[stack removeObjectAtIndex:(stack.count-2)];
}
navigationController.viewControllers = [stack copy];
navigationController.delegate = nil;
}
好的,我做了,花了很多时间才发现。我的情况可能不是常见的情况。这仅供参考。