2013-10-03 2 views
4

Я использую следующий код, чтобы показать UIImagePickerController взять картину:отклонившего UIImagePickerController также делает родительский Dissapear

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 
[imagePicker setDelegate:self];  
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera]; 
[self presentViewController:imagePicker animated:YES completion:nil]; 

Примечание: само это UIViewController встроен в контейнер View, который сам принимает часть в 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 уходит, но и главный вид исчезает! С Fade to Black.

Я кодирую iOS7 в приложении iPad только в том случае, если это имеет какое-либо отношение к нему.

Вот видео, которое показывает проблему. Извините размытие, но оно находится под NDA.

http://www.youtube.com/watch?v=sIaPyRlIqyE

+0

Попробуйте вызвать 'dismissViewControllerAnimated ...' 'на picker' вместо' self'. – rmaddy

+0

@rmaddy Пробовал это уже. То же самое происходит. – Jan

+0

Является ли эта проблема на iPad или iPhone? – rmaddy

ответ

0

Рекомендуется использовать UIPopOver в то время как вы открываете рулон камеры для IPad как этот так дайте ему попробовать надеюсь, что это поможет вам.

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

Эй, спасибо за ваш ответ. Фактически я использовал PopOver при работе с iOS 6, но с iOS 7 камера показывает поворот на 90 градусов при использовании в PopOver. Даже Apple рекомендует больше не использовать popover. Вы можете увидеть больше информации об этом в этом ответе: http: // stackoverflow.com/a/19030558/517688 – Jan

+0

@Jan: если бы вы могли видеть, что сообщение и мой ответ - это то же самое, он сказал, что если вы используете камеру как источник, то представляете ее на 'presentModalViewController', но если вы выбираете изображение, откройте его в PopOver, чтобы мой код делал то же самое, и просто попробуйте, как только он решит вашу проблему :) –

+0

@ D-eptfeveloper: если вы внимательно посмотрите на вопрос, к которому я привязался (я действительно связан с ответ), он говорит использовать '-presentViewController: анимированный: завершение:', а не 'presentModalViewController'. – Jan

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] ; 

Затем, при обращении с делегатами сборщика - вместо увольнения, используйте;

[picker.view removeFromSuperview] ; 
[picker removeFromParentViewController] ; 

Все, что вы потеряли, это оживленное настоящее/увольнение - кроме этого все должно быть хорошо.

+1

Отлично! Его работа даже для iOS 8 :) – Femina

+0

Хотя это простое решение. Отличная помощь мне !!! Отлично работает в 8.1.1! –

+0

Может кто-нибудь объяснить, почему приведенный выше код работает в 8.1 и почему он не работает должным образом <8? Я использовал функцию offsetModal, и с момента обновления до ios 8 мое приложение было повреждено при использовании камеры. Кстати, это исправить мою проблему и спасибо! – tg2007

0

Когда UIImagePickerController официально распускает, это вызывает следующие методы на то, что ВК сразу за ним в стек навигации:

- viewWillAppear 
- viewDidAppear 
- viewDidLayoutSubviews 
a bunch of other methods having to do with basic VC lifecycle. 

В моем случае, я не предъявившему верхний VC с помощью метода presentViewController: , Я создавал его как дочерний элемент корневого VC и выполнял некоторые пользовательские анимации. Я выполнял большую часть этой работы в методе -viewDidLayoutSubviews. Часть этой работы заключалась в том, что рамка моего дочернего представления отображается в выключенном положении.

Итак, когда я анимировал просмотр моего ребенка на экране, представил камеру, а затем отклонил ее, приложение в конечном итоге вызвало -viewDidLayoutSubviews на моем rootVC, которое переместило мой childVC за пределы экрана.

Итак, я думаю, что ответ должен состоять в том, чтобы установить начальный код установки VC только один раз (используйте что-то вроде Bool setupHasAlreadyHappenedOnce перед тем, как выложить все).

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]; 

} 
0

Я имел подобную, но не точно проблему, когда я пытался представить UIImagePickerController из в UIContainerView.

Проблема заключалась в том, что отклонение UIImagePickerController изменило навигацию в самом UIContainerView (изменение размера до полноэкранного).

Решение должно было представить UIImagePickerController из контроллера PARENT View UIContainerView, и теперь все работает отлично.

0

Для уведомления делегат UIImagePickerController является «двойным делегатом», он также делегирует UINavigationControllerDelegate. См. Код ниже.

@property(nullable,nonatomic,weak) id <UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate; 

Таким образом, проверить, если self также осуществлять UINavigationControllerDelegate и уволить родительскую ViewController, как показано ниже.

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

ОК, я сделал, и это стоило мне много времени, чтобы это выяснить. Моя ситуация может быть не обычным делом. Это просто для справки.

3

Попробуйте установить ваш сборщика изображения в .modalPresentationStyle либо .OverCurrentContext или .OverFullScreen:

Альтернативно:

viewController.definesPresentationContext = true 
imagePicker.modalPresentationStyle = .CurrentContext OR .FullScreen 

Дело в том, что отношения между этими двумя свойствами, необходимо сохранить как таковой: если false то .OverCurrentContext , если true, то .CurrentContext

В моем случае, диспетчерконтроллера видаигнорировал значение false, поэтому я использовал первый вариант.

See documentation for some insight.

Смежные вопросы