2013-06-21 2 views
8

У меня есть кнопка, которая при нажатии отображает камеру (работает отлично)Использование UIImagePickerController в UIView

- (IBAction)getPhoto:(id)sender 
{ 
    NSLog(@"Button clicked!"); 
    imagePicker = [[UIImagePickerController alloc] init]; 
    imagePicker.delegate = self; 

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { 
     [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera]; 
    } 

    else { // IF the device doesn't have a camera, so use the photos album 
     [imagePicker setSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum]; 
    } 

    [self addSubview:imagePicker.view]; 
} 

После чего я могу взять изображение и т.д., - Но когда я нажимаю «использование»: ничто здесь не происходит мой метод: Image picker не отклоняет его: приложение просто ничего не делает, я пытаюсь взять изображение, которое я только что взял, и отобразить его внутри CGRect на экране.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    [picker dismissViewControllerAnimated:YES completion:NULL]; 

    UIImageView *patientImage = [[UIImageView alloc] init]; 
    patientImage.frame = CGRectMake(625, 25, 83, 103); 

    UIImage *chosenImage = info[UIImagePickerControllerEditedImage]; 
    self.patientImage.image = chosenImage; 
} 

Даже когда я нажал кнопку отмены, не принимая образ, imagePicker (интерфейс камеры) не освобождает себя

Любая помощь, советы или рекомендации будут очень полезны.

+0

patientImage.frame = CGRectMake (625, 25, 83, 103); здесь x отсутствует экран устройства :(поэтому вы не можете видеть изображение, а также [picker rejectViewControllerAnimated: YES complete: NULL]; в конце метода –

+0

спасибо Nitin, но я использую ipad, поэтому он находится в мой экран, и я попытался переместить shutVieController, без каких-либо успехов –

+0

терпелив. Я добавил в любое представление, например [self addSubview: patientImage]; –

ответ

4

Является ли метод getPhoto: в подклассе UIView?

Если то так, то было бы лучше:

  1. Перемещение getPhoto: код из UIView подкласса полностью, и поместить его в контроллер родительского вида представления.

  2. Сделайте UIButton свойство вашего UIView: @property (nonatomic, strong) UIButton *myButton;

  3. В контроллере представления, установите цель & действие баттона следующим образом:

    [myView.myButton addTarget:self action:@selector(getPhoto:) forControlEvents:UIControlEventTouchUpInside]; 
    
  4. Наконец, в вашем getPhoto: метод, вызов [self presentViewController:imagePicker animated:YES completion:NULL];

  5. Ваш - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info код должен als о заходим в контроллере представления, изменение self.patientImage.image = chosenImage; к myView.patientImage.image = chosenImage;

+0

Когда я размещаю строка 3 в методе viewdidload класса ViewController, я получаю сообщение об ошибке «PicBtn не найден на объекте типа myView» - но я объявил PicBtn как UIButton и как свойство в заголовке моего класса UIView «myView» –

+0

Для тех, кто заинтересован в его вопросе. Что сказал @vinnyCoyne, это правильная вещь. , , , но вместо вызова 'myView.myButton' необходимо сначала создать экземпляр класса myView, а затем вызвать его, используя имя переменной экземпляра. Это решило мою проблему. , спасибо –

5

You shouldn't be doing the "addSubview" thing up there, но вместо того, чтобы сделать:

[self presentViewController:imagePicker animated:YES completion:nil]; 
+1

Проблема: presentViewController - это метод UIViewController, мне нужно, чтобы это приложение работало внутри UIView, любая идея? –

+1

В представлении не должно быть ответственности за представление другого контроллера. Это противоречит MVC, который лежит в основе iOS. У вас должен быть контроллер просмотра, как это предлагается в этом ответе. –

-1

Удалить [self.addSubView:imagePicker.view]; и вместо

[self presentViewController:imagePicker animated:YES completion:NULL];

отпускаешь переменная picker хотя picker не определено. Вместо этого поставьте:

[self dismissModalViewControllerAnimated:YES completion:NULL]; и убедитесь, что он находится в конце вашего метода.

1

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

Если вы хотите, чтобы событие отмены добавило его, создав пользовательский UIBarButton и добавьте его.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 

UIImageView *patientImage = [[UIImageView alloc] init]; 
patientImage.frame = CGRectMake(625, 25, 83, 103); 

UIImage *chosenImage = info[UIImagePickerControllerEditedImage]; 
self.patientImage.image = chosenImage; 

[imagePicker.view removeFromSuperview]; 

} 
1

Try:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    [picker.view removeFromSuperview]; 

    UIImageView *patientImage = [[UIImageView alloc] init]; 
    patientImage.frame = CGRectMake(625, 25, 83, 103); 

    UIImage *chosenImage = info[UIImagePickerControllerEditedImage]; 
    self.patientImage.image = chosenImage; 
} 
5

Вместо добавления сборщика как подвид, вы должны добавить подборщика к UIPopoverController.

Вы можете отобразить его из вашего UIView подкласса с помощью метода presentPopoverFromRect:inView:permittedArrowDirections:animated: поповера так:

self.popover = [[UIPopoverController alloc] initWithContentViewController:imagePicker]; 
[self.popover presentPopoverFromRect:sender.frame inView:self permittedArrowDirections: UIPopoverArrowDirectionAny animated:YES]; 

Затем, вы можете использовать методы делегата уволить поповер с помощью:

[self.popover dismissPopoverAnimatedYES]; 

Требуется official docs:

Таблица показывает, что на IPAD, если указан типа источника UIImagePickerControllerSourceTypePhotoLibrary или UIImagePickerControllerSourceTypeSavedPhotosAlbum, вы должны представить початкоотделяющие изображения с помощью контроллера поповера, как описаны в «Представление и Отклонив поповер» в UIPopoverController класс Reference. Если вы попытаетесь представить средство выбора изображений по умолчанию (полноэкранный) для выбора среди сохраненных изображений и видеороликов, система вызывает исключение.

На IPad, если указать тип источника UIImagePickerControllerSourceTypeCamera, вы можете представить образ сборщика модально (полный экран) или с помощью поповер. Однако Apple рекомендует, чтобы вы отображали интерфейс камеры только на весь экран.