Использование 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];
}

После чего я могу взять изображение и т. Д. - Но когда я нажимаю «использовать»: ничего не происходит, вот мой метод: средство выбора изображений не закрывает себя: приложение просто ничего не делает, я пытаюсь взять изображение, которое я просто взял и отобразил его внутри 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 (интерфейс камеры) не закрывается.

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


person Taskinul Haque    schedule 21.06.2013    source источник
comment
пациентаImage.frame = CGRectMake (625, 25, 83, 103); вот x находится вне экрана устройства :( поэтому вы не можете видеть изображение, а также [picker dismissViewControllerAnimated: YES завершение: NULL]; в конце метода   -  person Nitin Gohel    schedule 21.06.2013
comment
спасибо, Нитин, но я использую ipad, поэтому он на моем экране, и я попытался переместить dismissVieController, но безуспешно   -  person Taskinul Haque    schedule 21.06.2013
comment
добавлено ли изображение пациента в какое-либо представление? как [self addSubview: PatientImage];   -  person Kuriakose Pious P    schedule 26.06.2013


Ответы (6)


Находится ли метод 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 код также должен войти в контроллер представления, изменив self.patientImage.image = chosenImage; на myView.patientImage.image = chosenImage;

person Vinny Coyne    schedule 23.06.2013
comment
Когда я помещаю строку 3 в метод viewdidload класса ViewController, я получаю сообщение об ошибке, в котором говорится, что PicBtn не найден в объекте типа myView, но я объявил PicBtn как UIButton и как свойство в заголовке моего класса UIView myView - person Taskinul Haque; 24.06.2013
comment
Для тех, кто также заинтересован в его вопросе. То, что сказал @vinnyCoyne, было правильным. . . . но вместо вызова myView.myButton вы должны сначала создать экземпляр класса myView, а затем вызвать его, используя имя переменной экземпляра. Это решило мою проблему. . Спасибо - person Taskinul Haque; 04.07.2013

Вы не должны делать там "addSubview", а вместо этого сделайте:

[self presentViewController:imagePicker animated:YES completion:nil];
person Michael Dautermann    schedule 21.06.2013
comment
Проблема в том, что ViewController - это метод UIViewController, мне нужно, чтобы это приложение работало внутри UIView, есть идея? - person Taskinul Haque; 21.06.2013
comment
Представление не должно отвечать за представление другого контроллера. Это противоречит MVC, который лежит в основе iOS. Вы должны сделать это с помощью контроллера представления, как предлагается в этом ответе. - person JRG-Developer; 28.06.2013

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

Затем вы можете отобразить его из подкласса UIView, используя метод presentPopoverFromRect:inView:permittedArrowDirections:animated: popover следующим образом:

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

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

[self.popover dismissPopoverAnimatedYES];

Требуется официальными документами:

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

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

person lnafziger    schedule 28.06.2013

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

Если вы хотите, чтобы событие отмены, добавьте его, создав пользовательский 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];

}
person Arun    schedule 24.06.2013

Пытаться:

- (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;
}
person user754905    schedule 28.06.2013

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

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

Вы отклоняете переменную picker, хотя picker не определена. Вместо этого положите:

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

person Milo    schedule 21.06.2013