Використання 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 (інтерфейс камери) не звільняє себе

Будь-яка допомога, порада чи керівництво будуть дуже вдячні.

8
patientImage.frame = CGRectMake (625, 25, 83, 103); тут x знаходиться поза екраном пристрою: (так що ви не можете бачити зображення, а також [збирач dismissViewControllerAnimated: ТАК завершення: NULL]; в кінці методу
додано Автор Nitin Gohel, джерело
patientImage.frame = CGRectMake (625, 25, 83, 103); тут x знаходиться поза екраном пристрою: (так що ви не можете бачити зображення, а також [збирач dismissViewControllerAnimated: ТАК завершення: NULL]; в кінці методу
додано Автор Nitin Gohel, джерело
дякую Нітину, але я використовую ipad, так що це на моєму екрані, і я намагався перемістити dismissVieController без успіху
додано Автор Taskinul Haque, джерело
дякую Нітину, але я використовую ipad, так що це на моєму екрані, і я намагався перемістити dismissVieController без успіху
додано Автор Taskinul Haque, джерело
Характеристика хворого додана до будь-якого вигляду? як [self addSubview: patientImage];
додано Автор Kuriakose Pious P, джерело
Характеристика хворого додана до будь-якого вигляду? як [self addSubview: patientImage];
додано Автор Kuriakose Pious P, джерело

11 Відповіді

You shouldn't be doing the "addSubview" thing up there but instead do:

[self presentViewController:imagePicker animated:YES completion:nil];
5
додано
Погляд не повинен бути відповідальним за подання іншого контролера. Це суперечить MVC, яка є основою iOS. Ви повинні мати контролер перегляду, як це пропонується в цьому відповіддю.
додано Автор JRG-Developer, джерело
Проблема присутняViewController є методом UIViewController, мені потрібно, щоб ця програма працювала всередині UIView, будь-якої ідеї?
додано Автор Taskinul Haque, джерело

You shouldn't be doing the "addSubview" thing up there but instead do:

[self presentViewController:imagePicker animated:YES completion:nil];
5
додано
Погляд не повинен бути відповідальним за подання іншого контролера. Це суперечить MVC, яка є основою iOS. Ви повинні мати контролер перегляду, як це пропонується в цьому відповіддю.
додано Автор JRG-Developer, джерело
Проблема присутняViewController є методом UIViewController, мені потрібно, щоб ця програма працювала всередині UIView, будь-якої ідеї?
додано Автор Taskinul Haque, джерело

Замість того, щоб додати вибирача як підввіток, слід додати вибирач до UIPopoverController .

Потім ви можете відобразити його з підкласу UIView , скориставшись таким методом: presentPopoverFromRect: inView: allowedArrowDirections: animated: .

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

Потім ви можете скористатися методами делегатів, щоб відхилити вікно popover, використовуючи:

[self.popover dismissPopoverAnimatedYES];

Це вимагається офіційними документами :

У таблиці вказано, що на iPad, якщо ви вказали тип джерела UIImagePickerControllerSourceTypePhotoLibrary або    UIImagePickerControllerSourceTypeSavedPhotosAlbum , ви повинні подати   збирач зображень за допомогою контролера popover, як описано в   "Презентація та відхилення Popover" в класі UIPopoverController   Посилання Якщо ви спробуєте модально представити знімок зображень   (повноекранний) для вибору серед збережених зображень та фільмів - системи   піднімає виняток.

     

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

5
додано

Замість того, щоб додати вибирача як підввіток, слід додати вибирач до UIPopoverController .

Потім ви можете відобразити його з підкласу UIView , скориставшись таким методом: presentPopoverFromRect: inView: allowedArrowDirections: animated: .

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

Потім ви можете скористатися методами делегатів, щоб відхилити вікно popover, використовуючи:

[self.popover dismissPopoverAnimatedYES];

Це вимагається офіційними документами :

У таблиці вказано, що на iPad, якщо ви вказали тип джерела UIImagePickerControllerSourceTypePhotoLibrary або    UIImagePickerControllerSourceTypeSavedPhotosAlbum , ви повинні подати   збирач зображень за допомогою контролера popover, як описано в   "Презентація та відхилення Popover" в класі UIPopoverController   Посилання Якщо ви спробуєте модально представити знімок зображень   (повноекранний) для вибору серед збережених зображень та фільмів - системи   піднімає виняток.

     

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

5
додано

Чи є метод getPhoto: у підкласі UIView ?

Якщо це буде справа, то краще:

  1. Move the getPhoto: code out of the UIView subclass entirely, and put it in the view's parent view controller.

  2. Make your UIButton a property of your UIView: @property (nonatomic, strong) UIButton *myButton;

  3. In your view controller, set the button's target & action as follows:

    [myView.myButton addTarget:self action:@selector(getPhoto:) forControlEvents:UIControlEventTouchUpInside];
    
  4. Finally, in your getPhoto: method, call [self presentViewController:imagePicker animated:YES completion:NULL];

  5. Your - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info code should also go in the view controller, changing self.patientImage.image = chosenImage; to myView.patientImage.image = chosenImage;

4
додано
Коли я розміщую рядок 3 в методі viewdidload класу ViewController, я отримую помилку про те, що "PicBtn не знайдено в об'єкті типу myView" - але я оголосив PicBtn як UIButton і як властивість у заголовку мого класу UIView " myView "
додано Автор Taskinul Haque, джерело
Для тих, хто також зацікавлений в його питання Що @ ВінніКойн ​​сказав, що це правильно зробити. . . . але замість виклику myView.myButton необхідно спочатку створити екземпляр класу myView, а потім називати його за допомогою назви змінної екземпляра. Це вирішило мою проблему. . Дякую
додано Автор Taskinul Haque, джерело

Чи є метод getPhoto: у підкласі UIView ?

Якщо це буде справа, то краще:

  1. Move the getPhoto: code out of the UIView subclass entirely, and put it in the view's parent view controller.

  2. Make your UIButton a property of your UIView: @property (nonatomic, strong) UIButton *myButton;

  3. In your view controller, set the button's target & action as follows:

    [myView.myButton addTarget:self action:@selector(getPhoto:) forControlEvents:UIControlEventTouchUpInside];
    
  4. Finally, in your getPhoto: method, call [self presentViewController:imagePicker animated:YES completion:NULL];

  5. Your - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info code should also go in the view controller, changing self.patientImage.image = chosenImage; to myView.patientImage.image = chosenImage;

4
додано
Коли я розміщую рядок 3 в методі viewdidload класу ViewController, я отримую помилку про те, що "PicBtn не знайдено в об'єкті типу myView" - але я оголосив PicBtn як UIButton і як властивість у заголовку мого класу UIView " myView "
додано Автор Taskinul Haque, джерело
Для тих, хто також зацікавлений в його питання Що @ ВінніКойн ​​сказав, що це правильно зробити. . . . але замість виклику myView.myButton необхідно спочатку створити екземпляр класу myView, а потім називати його за допомогою назви змінної екземпляра. Це вирішило мою проблему. . Дякую
додано Автор Taskinul Haque, джерело

Видаліть [self.addSubView: imagePicker.view]; і замість нього

[self-presentViewController: imagePicker анімований: ТАК завершення: NULL];

Ви відхиляєте змінну picker , хоча picker не визначено. Замість цього поставте:

[self dismissModalViewControllerAnimated:YES completion:NULL]; and make sure its at the end of your method.

1
додано

Видаліть [self.addSubView: imagePicker.view]; і замість нього

[self-presentViewController: imagePicker анімований: ТАК завершення: NULL];

Ви відхиляєте змінну picker , хоча picker не визначено. Замість цього поставте:

[self dismissModalViewControllerAnimated:YES completion:NULL]; and make sure its at the end of your method.

1
додано

Спробуйте:

- (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;
}
1
додано

Спробуйте:

- (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;
}
1
додано

Не знаєте, чому кнопка скасування не працює. Але внесіть цю зміну, щоб вибрати зображення, яке ви натискаєте.

Якщо ви хочете скасувати подію, додати його, створивши спеціальний 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
додано
IT KPI iOS
IT KPI iOS
74 учасників

Чат обсуждения IOS. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/602

ios_jobs_ua
ios_jobs_ua
27 учасників

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.