Błąd UIImagePickerController: przycinanie widoku, który nie został renderowany, powoduje pustą migawkę w systemie iOS 7

Dostaję ten błąd tylko w iOS 7 i aplikacja uległa awarii. W iOS 6 nigdy nie dostaję żadnego błędu, tylko raz ostrzeżenia o pamięci podczas otwierania aparatu.

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.
Oto, co robię.
imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setDelegate:self];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setAllowsEditing:YES];

[self presentModalViewController:imagePicker animated:YES];

Próbowałem opóźnić presentModalViewController, ale wciąż otrzymuję tę samą wiadomość. Po kilku sekundach (7-10) aplikacja zawiesiła się.

Ten błąd występuje tylko w iOS 7.

Ktoś ma wskazówkę? Z góry dziękuję.
Author: Marco, 2013-09-19

16 answers

Problem w iOS7 ma związek z przejściami. Wydaje się, że jeśli poprzednie Przejście nie zostało zakończone i uruchomisz nowe, iOS7 namiesza widoki, gdzie iOS6 wydaje się zarządzać nim poprawnie.

Powinieneś zainicjować kamerę w swoim UIViewController, dopiero po załadowaniu widoku i z limitem czasu:

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

A oto kod inicjalizacji

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

    [self presentModalViewController:imagePicker animated:YES];
}
 32
Author: Lefteris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-14 10:04:10

Ten błąd pojawił się również dla mnie w projekcie przykładowego kodu PhotoPicker firmy Apple.

Używałem Xcode w wersji 5.0 i iOS 7.0.3 na iPhone 4.

Kroki do odtworzenia:

  1. Pobierz przykładowy projekt Apple PhotoPicker na https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html

  2. W APLViewController.m comment out line 125

    //imagePickerController.showsCameraControls = NO;

  3. W APLViewController.m komentuj wiersze 130-133

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

  4. Zbuduj i uruchom aplikację.

  5. Po uruchomieniu obróć urządzenie do trybu poziomego.

  6. Kliknij ikonę kamery, aby otworzyć UIImagePickerController w trybie kamery.

  7. Wyświetl wyjście konsoli.

Wyjście konsoli

PhotoPicker[240: 60B] Snapshotting widok, który nie został renderowany powoduje pusty migawka. Upewnij się, że Widok został renderowany co najmniej raz przed Snap-shottem lub migawką po aktualizacji ekranu.

ShowsCameraControls property

Problem występuje dla mnie, gdy ma wartość YES (domyślna).

Ustawienie tego NA NO wyeliminowało wiadomość.

Zgłaszanie błędów

Właśnie zgłosiłem błąd w Apple.

Próbowałem wielu sugestii, które zostały złożone w różnych postach, ale nie znalazłem zadowalające obejście.

 18
Author: Scott Carter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-30 10:52:03

[2]} mam problem, gdy próbowałem przedstawić widok z kamery wewnątrz popover. Pod iOS6 to nie bylo problemu ale w iOS7 dostalem wiadomosc

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.

Jak również.

Jednak po zmianie prezentacji widoku kamery na pełnoekranowy, jak opisano w robienie zdjęć i filmów, Biblioteka programisty iOS wszystko poszło dobrze, a wiadomość nigdy nie pojawiła się ponownie. Musiałem jednak upewnić się, że w zależności od tego, w jakim trybie aplikacja jest (tj. widok lub zdjęcie rolki) musiałem albo odrzucić popover lub kontroler widoku za każdym razem, gdy wywołano metodę - (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker.

 11
Author: Arne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-23 17:53:31

Utwórz Właściwość

@property (nonatomic) UIImagePickerController *imagePickerController;

Then

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

To powinno rozwiązać problem

 6
Author: Asfanur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-12 03:42:53

Użyłem tego kodu, aby obejść problem:

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];
}
 4
Author: Germán Marquès,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-26 11:50:11

Mam ten sam problem i znalazłem rozwiązanie. Myślę, że ten błąd związany z orientacją aplikacji. Moja aplikacja korzysta tylko z trybu poziomego, ale UIImagePickerController używa trybu pionowego. Dodaję try-catch block do main.m, I get real exception:

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

Jak rozwiązać ten problem:

1) Sprawdź ponownie orientację urządzenia w Target - > ogólne, lub .plik plist: obsługiwane orientacje interfejsu: Landscape left, Landscape right.

2) Dodaj AppDelegate.m:

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

Po tym kroku UIImagePickerController działa poprawnie, ale moje Kontrolery ViewController mogą być obracane do trybu portretowego. Więc, aby rozwiązać ten problem:

3) Utwórz kategorię dla UINavigationController, (supportedInterfaceOrientations przeniesione z UIViewController do UINavigationController w iOS6):

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

To rozwiązanie działa poprawnie na iOS 6.0, 6.1, 7.0. Mam nadzieję, że to pomoże.

 3
Author: Roman Ermolov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-25 09:21:49

Dostaję ten błąd podczas budowania aplikacji z iOS SDK 6.1, docelowego wdrożenia iOS 6.1 i uruchamiania aplikacji na iOS 7 na iPhonie. Aplikacja nie ulega awarii, ale implementacja metody UIViewController shouldAutorotate pomaga mi usunąć komunikat o błędzie.

- (BOOL)shouldAutorotate {
    return YES;
}
 3
Author: Grigori A.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-14 07:35:48

Miałem ten sam problem, gdy próbowałem zmodyfikować aplikację demo, która pochodzi z Avirary SDK , w aplikacji demo może edytować tylko zdjęcie wybrane z rolki aparatu. Aby spróbować edytować zdjęcie poprzez przechwytywanie z aparatu, najpierw dodałem następujący kod w kontrolerze UIViewcontroller.plik 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];
        }
    }
}

Potem, gdy uruchamiam aplikację, wystąpił błąd:

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.

Aby rozwiązać ten błąd, zmodyfikuj delegata UIImagePicker w aplikacji UIViewContooler.plik m jak pokazano poniżej:

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

}    

Potem błąd zniknął i aplikacja działa!

 3
Author: Tony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-03 04:49:02

Spróbuj tego, użyj

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

I funkcja

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

Do zastąpienia. [self presentModalViewController:imagePicker animated:YES]; i Cause make imagePicker jako zmienna globalna.

 1
Author: JerryZhou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-26 06:30:27

To jest to, co Naprawiono dla mnie w mojej aplikacji, ymmv

Po pierwsze jest to aplikacja iPhone-iPad

In appname-Info.plist. w obsługiwanych orientacjach interfejsu (iPad) pokazano 4 orientacje.

W obsługiwanym interfejsie orientacje pokazały 3 orientacje. Dodałem czwarty i uruchomiłem aplikację, bez wyjścia debugowania.

Mam nadzieję, że to pomoże.

 1
Author: user1045302,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-15 05:15:54

Właśnie napotkałem ten sam problem. W moim przypadku problem polegał na tym, że miałem jakiś kod nie-ARC i przeniosłem go do ARC. Kiedy robiłem migrację, nie miałem mocnego odniesienia do UIImagePickerController i to było powodem katastrofy.

Mam nadzieję, że pomoże:)

 0
Author: arturgrigor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-26 11:32:17

Miałem ten sam problem w iOS 8, Ale dostęp do Kamery był wyłączony wewnątrz Ustawienia -- > Prywatność dla mojej aplikacji. Włączyłem i działało.

 0
Author: BhushanVU,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-10 12:34:40

Spędziłem długi czas próbując znaleźć rozwiązanie, i o dziwo znalazłem je na końcu i było to po prostu bardzo zabawne, gdy go odkryłem.

Oto, co zrobisz, aby odzyskać wybrany obraz i wznowić pracę:)

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

Tak, aby rozwiązać problem, musisz tylko normalnie odrzucić próbnik, ponieważ wydaje się, że komunikat: "Snapshotting widoku, który nie został wyrenderowany, powoduje pustą migawkę. Upewnij się, że Widok został renderowany przynajmniej raz przed Snap shotting lub migawka po aktualizacji ekranu."powstrzymuje próbnik przed reagowaniem, ale można go odrzucić i odzyskać obraz normalnie.

 0
Author: DevSherif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-06 09:56:19

W moim przypadku było to związane ze zmianą układu: VC prezentujący {[0] } ma ukryty pasek stanu, ale UIImagePickerViewController nie ma.

Więc, rozwiązałem to ukrywanie paska stanu w UIImagePickerViewController, Jak pokazano w tej ODPOWIEDŹ .

 0
Author: kanobius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-14 15:49:21

Nie odpowiadając bezpośrednio na twoje pytanie, ale wspomniałeś, że masz ostrzeżenie o pamięci ,możesz przechowywać obraz raw w właściwości, która może prowadzić do ostrzeżenia o pamięci. Dzieje się tak dlatego, że obraz w formacie raw zajmuje około 30 MB pamięci. Zauważyłem podobne ostrzeżenie o pamięci podczas testowania aplikacji na iOS6, które były na iPhone Serii 4. Nadal otrzymałem to Ostrzeżenie, gdy urządzenia zostały zaktualizowane do iOS7. Podczas testowania na iPhone 5 series na iOS7 nie ma ostrzeżenia o pamięci.

 -1
Author: DevC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-10 09:56:12

Zmiana

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

Do

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

Naprawiono problem dla mnie.

 -5
Author: Yuki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-02 20:08:19