Помилка UIImagePickerController: Знімок перегляду, який не надано, призводить до порожнього знімка в iOS 7


103

Я отримую цю помилку лише в iOS 7, і програма вийшла з ладу. В iOS 6 я ніколи не отримую жодної помилки, лише один раз попередження про пам'ять під час відкриття камери.

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

Ось що я роблю.

imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setDelegate:self];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setAllowsEditing:YES];

[self presentModalViewController:imagePicker animated:YES];

Я намагався затримати presentModalViewController, але я все одно отримую те саме повідомлення. Через кілька секунд (7-10) програма перестала працювати.

Ця помилка присутня лише в iOS 7.

Хтось має підказку?


3
У мене така ж проблема. На iOS7 UIIMagePickerController більше не працює.
condor304

Виклик цього методу працював на мене. Розмістіть його після того, як ви представите свій погляд. [yourViewBeingPresented.view layoutIfNeeded];
Боббі

Відповіді:


32

Проблема в iOS7 пов'язана з переходами. Здається, що якщо попередній перехід не завершився, і ви запустили новий, iOS7 змінює погляди, де iOS6, здається, керує ним правильно.

Ви повинні ініціалізувати свою камеру UIViewControllerлише після завантаження перегляду та з таймаутом:

- (void)viewDidAppear:(BOOL)animated 
{
    [super viewDidAppear:animated];
    //show camera...
    if (!hasLoadedCamera)
        [self performSelector:@selector(showcamera) withObject:nil afterDelay:0.3];
}

і ось код ініціалізації

- (void)showcamera {
    imagePicker = [[UIImagePickerController alloc] init];
    [imagePicker setDelegate:self];
    [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
    [imagePicker setAllowsEditing:YES];

    [self presentModalViewController:imagePicker animated:YES];
}

1
Здається, це працює досі, я перевірив це, взявши 10 фото один за одним без проблем.
DevC

3
В iOS 6. застаріле теперішнє уявлення MontalViewController пропонується використовувати теперішнійViewController.
Галлімон

5
Ті ж проблеми і виправлення для iOS8.
Яухені Шаученка,

1
Я намагаюся зробити цю роботу від UIAertControl - один із варіантів - представити інструмент вибору зображень для веб-переглядача - це працює чудово, а інший - представити для камери - це не так, де я буду будувати затримку під час використання UIALertController?
SimonTheDiver

3
Я не ініціалізую камеру в viewDidAppear / Load. У мене є табличний перегляд, і я піднімаю камеру у відповідь на один з варіантів нагляду настільних. І я отримую це повідомлення про помилку. Якісь ідеї?
Хеннінг

18

Ця помилка виявилася і для мене у проекті зразкового коду Apple PhotoPicker.

Я використовував Xcode версії 5.0 та iOS 7.0.3 на iPhone 4.

Кроки до відтворення:

  1. Завантажте зразок проекту PhotoPicker від Apple на https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html

  2. У коментарі APLViewController.m викладіть рядок 125

    //imagePickerController.showsCameraControls = NO;

  3. У APLViewController.m коментують рядки 130-133

    //[[NSBundle mainBundle] loadNibNamed:@"OverlayView" owner:self options:nil];
    // self.overlayView.frame = imagePickerController.cameraOverlayView.frame;
    // imagePickerController.cameraOverlayView = self.overlayView;
    // self.overlayView = nil;

  4. Створіть та запустіть додаток.

  5. Після запуску поверніть пристрій у ландшафтний режим.

  6. Натисніть значок камери, щоб відкрити UIImagePickerController у режимі камери.

  7. Переглянути вихід консолі.

Вихід консолі

PhotoPicker [240: 60b] Знімок перегляду, який не було надано, призводить до порожнього знімка. Переконайтесь, що ваш погляд був відображений хоча б раз перед знімком або знімком після оновлення екрана.

показує властивістьCameraControls

Проблема виникає для мене, коли це значення має ТАК (за замовчуванням).

Встановлення цього параметра "НІ" усунуло повідомлення.

Повідомлення про помилку

Я щойно подав звіт про помилку в Apple.

Я спробував багато пропозицій, які були зроблені на різних посадах, але не знайшов задовільного рішення.


1
Як вам відповів яблуко? У мене така ж проблема і рішення в stackoverflow не працюють.
heekyu

Я ще не чув про це від Apple. Я опублікую відповідь, якщо отримаю відповідь від них.
Скотт Картер

Якісь новини від Apple? @ScottCarter
Бенджамін Туег

1
Просто перевірено ще раз. Жодних дій щодо відкритої помилки, оскільки вона була подана 2 листопада 2013 р.
Скотт Картер

Це помилка 15377241 на bugreport.apple.com
Скотт Картер,

11

Проблема у мене виникла, коли я намагався представити вигляд камери всередині попову. У iOS6 це не було проблем, але в iOS7 я отримав повідомлення

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

також.

Однак після того, як я змінив подання перегляду камери на повний екран, як описано в " Зйомка зображень і фільмів", у Бібліотеці розробників iOS все знову пішло добре, і повідомлення більше не з’являлося. Однак я повинен був переконатися, що залежно від того, у якому режимі знаходиться додаток (тобто, представляючи перегляд камери чи фоторолик), мені доведеться або відхиляти перехоплення, або контролер перегляду кожного разу, коли метод - (void) imagePickerControllerDidCancel: (UIImagePickerController *) pickerвикликається.


3
cameraUI.modalPresentationStyle = UIModalPresentationFullScreen; працює для мене. Це єдине, що тут було успішним. Дякую!
daveMac

2
Нарешті! У мене була ця проблема багато разів і ніколи не знайшов хорошого рішення. Відчуваєте себе таким дурним, що ніколи не дивитесь далі в темах питань - imagePicker.modalPresentationStyle = UIModalPresentationFullScreen; вирішив це для мене. Це має бути прийнята відповідь :)
woobione

6

створити властивість

@property (nonatomic) UIImagePickerController *imagePickerController;

Тоді

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.modalPresentationStyle = UIModalPresentationCurrentContext;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = YES;
self.imagePickerController = picker;
[self presentViewController:self.imagePickerController animated:YES completion:nil];

Це повинно вирішити проблему


3
picker.modalPresentationStyle = UIModalPresentationCurrentContext; змінився для мене.
Містер Берна

1
Він працює вперше, коли вибирач вибирається, але після цього попередження повертається.
daveMac

я підтверджую picker.modalPresentationStyle = UIModalPresentationCurrentContext; Вирішує для мене проблему неправильних макетів в iOS 8
João Nunes

Не працює для мене - додав це до дії UIButton на iOS 8.1.3
Енді

Це здавалося багатообіцяючим, але нічого не зробило для мене з моменту зйомки та показало марну рамку навколо частини зображення після зйомки зображення.
малював ..

4

Я використовував цей код для вирішення проблеми:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setDelegate:self];

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
    [imagePicker setShowsCameraControls:NO];
    [self presentViewController:imagePicker animated:YES completion:^{
        [imagePicker setShowsCameraControls:YES];
    }];
} else {
    [imagePicker setShowsCameraControls:YES];
    [self presentModalViewController:imagePicker animated:YES];
}

1
Хоча ідея працює теоретично, на жаль, показані елементи керування не працюють або відображаються неправильно.
daveMac

І це попередження також не позбулося (як мінімум, для мене)
Еге Акпінар

3

У мене те саме питання і я знайшов рішення. Я думаю, що ця помилка пов'язана з орієнтацією вашої заявки. Моя програма використовує лише альбомний режим, але UIImagePickerController використовує портретний режим. Я додаю блок try-catch до main.m і отримую реальне виняток:

Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES

Як я вирішую цю проблему:

1) Перевірте орієнтацію пристрою в цільовому-> загальному або .plist-файлі: підтримувані орієнтації інтерфейсу: Пейзаж ліворуч, Пейзаж праворуч.

2) Додати в AppDelegate.m:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return UIInterfaceOrientationMaskLandscape | UIInterfaceOrientationMaskPortrait;
}

Після цього кроку UIImagePickerController працює належним чином, але мої оглядові контролери можуть бути повернені в портретний режим. Отже, щоб вирішити це:

3) Створіть категорію для UINavigationController (підтримуваніInterfaceOrientations переміщені з UIViewController в UINavigationController в iOS6):

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

Це рішення працює належним чином на iOS 6.0, 6.1, 7.0. Сподіваюся, це допомагає.


1
Я виправляю додаток у портретному режимі, який дає помилку, зазначену в ОП. Тож здавалося б, що ваше рішення не є загальноприйнятим.
JohnK

Чи намагалися ви додати блок try-catch до main.m та надрукувати винятки та стек-трек?
Роман Єрмолов

Як це ?
JohnK

@JohnK так, ось так.
Роман Єрмолов

3

Я отримую цю помилку під час створення програми з iOS SDK 6.1, цілі iOS 6.1 розгортання та запуску програми на iPhone з iOS 7. Додаток не виходить з ладу, але UIViewController shouldAutorotateметод реалізації допомагає мені видалити повідомлення про помилку.

- (BOOL)shouldAutorotate {
    return YES;
}

3

У мене виникло те саме питання, коли я намагався змінити демонстраційну програму, яка постачається разом із Avirary SDK , у демонстраційному додатку він може редагувати лише фотографії, вибрані з рулону камери. Щоб спробувати відредагувати фотографію, знявши з камери, я спершу додав у файл UIViewcontroller.m такий код:

#pragma mark - Take Picture from Camera
- (void)showCamera
{
//[self launchPhotoEditorWithImage:sampleImage highResolutionImage:nil];

    if ([self hasValidAPIKey]) {
        UIImagePickerController * imagePicker = [UIImagePickerController new];
        [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
        [imagePicker setDelegate:self];
        [imagePicker setAllowsEditing:YES]; //important, must have

        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
            [self presentViewController:imagePicker animated:YES completion:nil];
        }else{
            [self presentViewControllerInPopover:imagePicker];
        }
    }
}

Потім, коли я запускаю додаток, сталася помилка:

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

Щоб вирішити помилку, змінили делегата UIImagePicker у файлі UIViewContooler.m, як показано нижче:

#pragma mark - UIImagePicker Delegate

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSURL * assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];

    void(^completion)(void)  = ^(void){

        [[self assetLibrary] assetForURL:assetURL resultBlock:^(ALAsset *asset) {
            if (asset){
                [self launchEditorWithAsset:asset];
            }
        } failureBlock:^(NSError *error) {
            [[[UIAlertView alloc] initWithTitle:@"Error" message:@"Please enable access to your device's photos." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
        }];

        UIImage * editedImage = [info objectForKey:UIImagePickerControllerEditedImage];
        if(editedImage){
            [self launchPhotoEditorWithImage:editedImage highResolutionImage:editedImage];
        }

    };

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [self dismissViewControllerAnimated:YES completion:completion];
    }else{
        [self dismissPopoverWithCompletion:completion];
    }

}    

Потім помилка зникла і додаток працює!


1

Спробуйте це, використовуйте

[self performSelector:@selector(presentCameraView) withObject:nil afterDelay:1.0f];

і функціонувати

-(void)presentCameraView{
    [self presentViewController:imagePicker animated:YES completion:nil];
}

замінити. [self presentModalViewController:imagePicker animated:YES]; і викликають причину imagePickerяк глобальну змінну.


1

Це те, що було зафіксовано для мене у моїй програмі, ymmv

спочатку це додаток iPhone - iPad

у appname-Info.plist. у підтримуваних орієнтаціях інтерфейсу (iPad) показано 4 орієнтації.

в підтримуваному інтерфейсі орієнтації показали 3 орієнтації. Я додав четвертий і запустив додаток, не налагоджений вихід.

Сподіваюся, це допомагає.


0

Я щойно стикався з тим же питанням. У моєму випадку проблема полягала в тому, що у мене був не-ARC-код, і я перемістив його в ARC. Коли я здійснив міграцію, я не мав чітких посилань на це, UIImagePickerControllerі це було причиною краху.

Сподіваюся, це допомагає :)


0

У мене була така ж проблема в iOS 8, але доступ до камери був відключений у налаштуваннях -> конфіденційність для мого додатка. Просто увімкнув це, і він працював.


0

Я багато часу намагався знайти рішення, і дивно, що знайшов його наприкінці, і це було дуже смішно, коли я його виявив.

Ось що ви зробите для отримання обраного зображення та відновлення роботи :)

-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    UIImage* pickedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    [composeImageView setImage:pickedImage];
[picker dismissViewControllerAnimated:YES completion:nil];
 }

Так, щоб вирішити проблему, потрібно лише відмовити інструменту вибору, як здається, це повідомлення: "Знімок перегляду, який не було надано, призводить до порожнього знімка. Переконайтеся, що ваш погляд був винесений хоча б раз перед знімком або знімком після оновлення екрану. " перешкоджає реагуванню на інструмент вибору, але ви можете відхилити його та відновити зображення.


0

У моєму випадку це було пов’язано зі зміною макета: VC, що представляє, UIImagePickerViewControllerмає рядок стану прихованим, але UIImagePickerViewControllerне.

Отже, я вирішив це, сховавши рядок стану в тому, UIImagePickerViewControllerяк це показано у цій відповіді .


-1

Не відповідаючи безпосередньо на ваше запитання, але ви згадали, що у вас є попередження про пам’ять, ви можете зберігати необроблене зображення у властивості, яка може призвести до попередження пам'яті. Це тому, що необроблене зображення займає приблизно 30 МБ пам'яті. Я помітив подібне попередження про пам'ять під час тестування програм на iOS6, які були на iPhone 4 серії. Я все ще отримав це попередження, коли пристрої було оновлено до iOS7. Немає попередження про пам’ять при тестуванні на iPhone 5 серії на iOS7.


-5

Зміна

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

до

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

виправили проблему для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.