UIImagePickerController hatası: Oluşturulmamış bir görünümün anlık görüntülenmesi, iOS 7'de boş bir anlık görüntüye neden oluyor


103

Bu hatayı yalnızca iOS 7'de alıyorum ve uygulama çöktü. İOS 6'da, kamerayı açarken bir kez bellek uyarısı olmak üzere hiçbir zaman hata almıyorum.

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.

İşte yaptığım şey.

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

[self presentModalViewController:imagePicker animated:YES];

Geciktirmeye çalıştım presentModalViewControllerama hala aynı mesajı alıyorum. Birkaç saniye sonra (7-10), uygulama çöktü.

Bu hata yalnızca iOS 7'de mevcuttur.

İpucu olan var mı?


3
Bende de aynı sorun var. İOS7'de UIIMagePickerController artık çalışmıyor.
condor304

Bu yöntemi aramak benim için çalıştı. Görüşünüzü sunduktan sonra yerleştirin. [yourViewBeingPresented.view layoutIfNeeded];
Bobby

Yanıtlar:


32

İOS7'deki sorun geçişlerle ilgili. Görünüşe göre önceki bir geçiş tamamlanmadıysa ve yenisini başlatırsanız, iOS7, iOS6'nın bunu doğru bir şekilde yönetiyor gibi göründüğü görünümleri karıştırır.

Kameranızı UIViewController, yalnızca görünüm Yüklendikten ve bir zaman aşımı ile başlatmanız gerekir :

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

ve işte başlatma kodu

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

    [self presentModalViewController:imagePicker animated:YES];
}

1
Bu şimdiye kadar işe yarıyor gibi görünüyor, sorunsuz bir şekilde arka arkaya 10 fotoğraf çekerek test ettim.
DevC

3
presentModalViewController iOS 6'da kullanımdan kaldırıldı. PresentViewController'ın şimdi kullanılması öneriliyor.
Gallymon

5
İOS8 için aynı sorun ve düzeltme.
Yauheni Shauchenka

1
Bunu bir UIAertControl'den çalıştırmaya çalışıyorum - bir seçenek fotoğraf tarayıcısı için görüntü seçiciyi sunmaktır - bu iyi çalışıyor ve diğeri kamera için sunmak - bu değil. Kullanırken gecikmeyi nerede inşa ederdim bir UIALertController?
SimonTheDiver

3
Kamerayı viewDidAppear / Load içinde başlatmıyorum. Bir masa görüşüm var ve masa görünümü seçeneklerinden birine yanıt olarak kamerayı açıyorum. Ve bu hata mesajını alıyorum. Herhangi bir fikir?
Henning

18

Bu hata, Apple'ın PhotoPicker örnek kod projesinde de benim için ortaya çıktı.

Bir iPhone 4'te Xcode Sürüm 5.0 ve iOS 7.0.3 kullanıyordum.

Yeniden Oluşturma Adımları:

  1. Apple'ın PhotoPicker örnek projesini https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html adresinden indirin

  2. APLViewController.m açıklama satırında 125

    //imagePickerController.showsCameraControls = NO;

  3. APLViewController.m açıklamasında 130-133 satırları

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

  4. Uygulamayı oluşturun ve başlatın.

  5. Başlatıldığında, cihazı Yatay moda döndürün.

  6. UIImagePickerController'ı Kamera modunda açmak için Kamera simgesine tıklayın.

  7. Konsol çıktısını görüntüleyin.

Konsol çıkışı

PhotoPicker [240: 60b] Oluşturulmamış bir görünümün anlık görüntülenmesi boş bir anlık görüntüye neden olur. Ekran güncellemelerinden sonra anlık görüntü veya anlık görüntüden önce görünümünüzün en az bir kez işlendiğinden emin olun.

showCameraControls özelliği

Sorun benim için bu EVET (varsayılan) değerine sahip olduğunda ortaya çıkıyor.

Bunu HAYIR olarak ayarlamak mesajı ortadan kaldırır.

Hata raporu

Az önce Apple'a bir hata raporu verdim.

Farklı gönderilerde yapılan önerilerin çoğunu denedim, ancak tatmin edici bir çözüm bulamadım.


1
Apple sana nasıl cevap verdi? Aynı problemim var ve stackoverflow'da çözümler çalışmıyor.
heekyu

Bu konuda henüz Apple'dan haber almadım. Onlardan bir yanıt alırsam bir yanıt göndereceğim.
Scott Carter

Apple'dan haber var mı? @ScottCarter
Benjamin Toueg

1
Tekrar kontrol ettim. 2 Kasım 2013 tarihinde dosyalandığından bu yana açık hatayla ilgili herhangi bir işlem yapılmadı.
Scott Carter

Bugreport.apple.com adresindeki hata 15377241
Scott Carter

11

Bir açılır pencerenin içinde kamera görüntüsünü sunmaya çalıştığımda sorunu anladım. İOS6 altında bu sorun değildi ama iOS7'de mesajı aldım

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.

yanı sıra.

Ancak , Fotoğraf ve Film Çekme bölümünde açıklandığı gibi kamera görünümünün sunumunu tam ekrana değiştirdikten sonra , iOS Geliştirici Kitaplığı her şey yolunda gitti ve mesaj bir daha hiç görünmedi. Bununla birlikte, uygulamanın hangi modda olduğuna bağlı olarak (yani, kamera görüntüsü veya fotoğraf rulosu sunarken), yöntem - (void) imagePickerControllerDidCancel: (UIImagePickerController *) pickerher çağrıldığında açılır pencereyi veya görüntü denetleyicisini kapatmam gerektiğinden emin olmalıydım .


3
cameraUI.modalPresentationStyle = UIModalPresentationFullScreen; benim için çalışıyor. Burada başarılı olan tek şey bu. Teşekkürler!
daveMac

2
En sonunda! Bu sorunu birçok kez yaşadım ve hiçbir zaman iyi bir çözüm bulamadım. Soru dizilerine asla daha fazla bakmadığınız için şimdi kendinizi çok aptal hissedin - imagePicker.modalPresentationStyle = UIModalPresentationFullScreen; bunu benim için çözdü. Kabul edilen cevap bu olmalı :)
woobione

6

mülk yaratmak

@property (nonatomic) UIImagePickerController *imagePickerController;

Sonra

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

Bu sorunu çözmeli


3
picker.modalPresentationStyle = UIModalPresentationCurrentContext; benim için fark yarattı.
Bay Berna

1
Seçici ilk sunulduğunda çalışır, ancak bundan sonra uyarı geri döner.
daveMac

picker.modalPresentationStyle = UIModalPresentationCurrentContext'i onaylıyorum; Benim için iOS 8'deki yanlış düzen sorununu
João Nunes

Benim için çalışmıyor - bunu iOS 8.1.3'teki bir UIButton işlemine ekledi
Andy

Bu umut verici görünüyordu, ancak enstantane sorunu için benim için hiçbir şey yapmadı VE bir resim çekildikten sonra görüntünün bir kısmının etrafında işe yaramaz bir çerçeve gösterdi.
çizdi ..

4

Sorunu çözmek için bu kodu kullandım:

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
Fikir teoride işe yarasa da, ne yazık ki gösterilen kontroller çalışmıyor veya doğru görünmüyor.
daveMac

Ve uyarıdan da kurtulmadı (en azından benim için)
Ege Akpınar

3

Aynı sorunu yaşıyorum ve bir çözüm buldum. Sanırım bu hata başvurunuzun yönelimiyle ilgili. Uygulamam yalnızca yatay modu kullanıyor, ancak UIImagePickerController dikey modu kullanıyor. Main.m'ye try-catch bloğu ekledim ve gerçek bir istisna elde ediyorum:

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

Bu sorunu nasıl çözerim:

1) Hedef-> Genel veya .plist dosyasında cihaz yönünü tekrar kontrol edin: Desteklenen arayüz yönleri: Yatay sola, Sağa yatay.

2) AppDelegate.m'ye ekleyin:

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

Bu adımdan sonra UIImagePickerController düzgün çalışıyor, ancak görünüm denetleyicilerim dikey moda döndürülebilir. Yani, bunu çözmek için:

3) UINavigationController için bir kategori oluşturun (supportedInterfaceOrientations, iOS6'da UIViewController'dan UINavigationController'a taşındı):

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

Bu çözüm, iOS 6.0, 6.1, 7.0'da düzgün çalışır. Bu yardımcı olur umarım.


1
OP'de belirtilen hatayı veren portre modu uygulamasını düzeltirim. Dolayısıyla, çözümünüz evrensel olarak uygulanabilir değil gibi görünüyor.
JohnK

Main.m'ye try-catch bloğu eklemeyi ve istisnayı ve stacktrace'i yazdırmayı denediniz mi?
Roman Ermolov

Gibi bu ?
JohnK

@JohnK evet, böyle.
Roman Ermolov

3

İOS SDK 6.1, dağıtım hedefi iOS 6.1 ile uygulama oluştururken ve iOS 7 destekli iPhone'da uygulama çalıştırırken bu hatayı alıyorum. Uygulama çökmüyor, ancak uygulama UIViewController shouldAutorotateyöntemi hata mesajını kaldırmama yardımcı oluyor.

- (BOOL)shouldAutorotate {
    return YES;
}

3

Avirary SDK ile birlikte gelen demo uygulamasını değiştirmeye çalışırken de aynı sorunu yaşadım , demo uygulamasında, yalnızca kamera rulosundan alınan fotoğrafı düzenleyebiliyor. Fotoğrafı kameradan çekerek düzenlemeyi denemek için, önce aşağıdaki kodu UIViewcontroller.m dosyasına ekledim:

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

Sonra uygulamayı çalıştırdığımda hata oluştu:

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.

Hatayı çözmek için, UIViewContooler.m dosyanızdaki UIImagePicker temsilcisini aşağıda gösterildiği gibi değiştirin:

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

}    

Sonra hata kayboldu ve uygulama çalışıyor!


1

Bunu dene, kullan

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

ve işlev

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

değiştirmek. [self presentModalViewController:imagePicker animated:YES]; ve nedeni imagePickerküresel bir değişken olarak yapın.


1

Uygulamamda benim için düzelten şey bu, ymmv

ilk olarak bir iPhone - iPad uygulaması

appname-Info.plist'te. Desteklenen arayüz yönlerinde (iPad) 4 yön gösterildi.

Desteklenen arayüz yönlerinde 3 yön gösterildi. Dördüncü ekledim ve uygulamayı çalıştırdım, hata ayıklama çıktısı yok.

Bu yardımcı olur umarım.


0

Az önce aynı sorunla karşılaştım. Benim durumumda sorun, bazı ARC olmayan kodum olması ve onu ARC'ye taşıdığımdı. Taşımayı yaptığımda,UIImagePickerController ve kazanın nedeni buydu.

Umarım yardımcı olur :)


0

İOS 8'de de aynı sorunu yaşadım, ancak Ayarlar -> Uygulamam için Gizlilik içinde Kamera Erişimi Devre Dışı Bırakıldı. Sadece Etkinleştirdi ve çalışıyordu.


0

Çözümü bulmak için uzun zaman harcadım ve şaşırtıcı bir şekilde sonunda buldum ve keşfettiğimde çok eğlenceliydi.

İşte seçtiğiniz görüntüyü almak ve çalışmaya devam etmek için yapmanız gerekenler :)

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

Evet, sorunu çözmek için, yalnızca şu mesajda göründüğü için seçiciyi normal şekilde kapatmanız gerekir: "Oluşturulmamış bir görünümün anlık görüntüsünün alınması boş bir anlık görüntüye neden olur. Anlık görüntüden veya daha sonra anlık görüntüden önce görünümünüzün en az bir kez işlendiğinden emin olun ekran güncellemeleri. " seçicinin yanıt vermesini durdurur, ancak onu kapatabilir ve normal şekilde görüntüyü alabilirsiniz.


0

Benim durumumda, bir düzen değişikliği ile ilgiliydi: bunu sunan VC UIImagePickerViewController, durum çubuğunu gizledi, ancak UIImagePickerViewControllerdeğil.

Bu yüzden, UIImagePickerViewControllerbu cevapta gösterildiği gibi durum çubuğunu gizleyerek çözdüm .


-1

Sorunuza doğrudan cevap vermemekle birlikte bir hafıza uyarısı aldığınızdan bahsetmiştiniz, ham görüntüyü hafıza uyarısına yol açabilecek bir özellikte depoluyor olabilirsiniz. Bunun nedeni, ham görüntünün yaklaşık 30MB bellek kaplamasıdır. İPhone 4 serisindeki iOS6'daki uygulamaları test ederken benzer bir hafıza uyarısı fark ettim. Cihazlar iOS7'ye yükseltildiğinde hala bu uyarıyı alıyorum. İOS7'de iPhone 5 serisinde test edilirken hafıza uyarısı yoktur.


-5

Değiştirme

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

-e

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

sorunu benim için düzeltti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.