Kesalahan UIImagePickerController: Memotret tampilan yang belum dirender mengakibatkan snapshot kosong di iOS 7

103

Saya mendapatkan kesalahan ini hanya di iOS 7 dan aplikasi macet. Di iOS 6, saya tidak pernah mendapatkan error apa pun, hanya sekali dari memory warning saat membuka kamera.

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.

Inilah yang saya lakukan.

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

[self presentModalViewController:imagePicker animated:YES];

Saya memang mencoba untuk menunda presentModalViewController, tetapi saya masih mendapatkan pesan yang sama. Setelah beberapa detik (7-10), aplikasi macet.

Kesalahan ini hanya ada di iOS 7.

Ada yang tahu?

Didats Triadi
sumber
3
Saya memiliki masalah yang sama. Di iOS7, UIIMagePickerController tidak berfungsi lagi.
condor304
Memanggil metode ini berhasil untuk saya. Tempatkan setelah mempresentasikan pandangan Anda. [yourViewBeingPresented.view layoutIfNeeded];
Bobby

Jawaban:

32

Masalah di iOS7 berkaitan dengan transisi. Tampaknya jika transisi sebelumnya tidak selesai dan Anda meluncurkan yang baru, iOS7 mengacaukan tampilan, di mana iOS6 tampaknya mengelolanya dengan benar.

Anda harus menginisialisasi Kamera di Anda UIViewController, hanya setelah tampilan dimuat dan dengan batas waktu:

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

dan berikut adalah kode inisialisasi

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

    [self presentModalViewController:imagePicker animated:YES];
}
Lefteris
sumber
1
Ini sepertinya berhasil sejauh ini, saya telah mengujinya dengan mengambil 10 foto satu demi satu tanpa masalah.
DevC
3
presentModalViewController sudah tidak digunakan lagi di iOS 6. Disarankan agar presentViewController digunakan sekarang.
Gallymon
5
Masalah dan perbaikan yang sama untuk iOS8.
Yauheni Shauchenka
1
Saya mencoba membuat ini bekerja dari UIAertControl - satu opsi adalah menampilkan pemilih gambar untuk browser foto - ini berfungsi dengan baik dan yang lainnya adalah menampilkan untuk kamera - ini tidak. Di mana saya akan membangun penundaan saat menggunakan sebuah UIALertController?
SimonTheDiver
3
Saya tidak menginisialisasi kamera di viewDidAppear / Load. Saya memiliki tampilan tabel, dan saya menampilkan kamera sebagai tanggapan atas salah satu pilihan tampilan tabel. Dan saya mendapatkan pesan kesalahan ini. Ada ide?
Henning
18

Kesalahan ini juga muncul untuk saya dengan proyek kode sampel PhotoPicker Apple.

Saya menggunakan Xcode Versi 5.0 dan iOS 7.0.3 di iPhone 4.

Langkah-langkah untuk Mereproduksi:

  1. Unduh proyek contoh PhotoPicker Apple di https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html

  2. Dalam APLViewController.m beri komentar baris 125

    //imagePickerController.showsCameraControls = NO;

  3. Dalam APLViewController.m beri komentar pada baris 130-133

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

  4. Bangun dan luncurkan aplikasi.

  5. Setelah diluncurkan, putar perangkat ke mode Lansekap.

  6. Klik ikon Kamera untuk membuka UIImagePickerController dalam mode Kamera.

  7. Lihat keluaran konsol.

Keluaran konsol

PhotoPicker [240: 60b] Memotret tampilan yang belum diberikan menghasilkan foto yang kosong. Pastikan tampilan Anda telah dirender setidaknya sekali sebelum melakukan snapshot atau snapshot setelah pembaruan layar.

properti showsCameraControls

Masalah terjadi pada saya saat ini memiliki nilai YA (default).

Mengatur ini ke NO menghilangkan pesan tersebut.

Laporan bug

Saya baru saja mengajukan laporan bug ke Apple.

Saya telah mencoba banyak saran yang telah dibuat di berbagai pos, tetapi belum menemukan solusi yang memuaskan.

Scott Carter
sumber
1
Bagaimana apel membalas Anda? Saya memiliki masalah yang sama dan solusi di stackoverflow tidak berfungsi.
heekyu
Saya belum mendengar dari Apple tentang ini. Saya akan mengirim balasan jika saya mendapat tanggapan dari mereka.
Scott Carter
Ada berita dari Apple? @Scottarter
Benjamin Touhou,
1
Baru diperiksa lagi. Tidak ada tindakan pada bug terbuka sejak diajukan pada 2 Nov 2013.
Scott Carter
Ini adalah bug 15377241 di bugreport.apple.com
Scott Carter
11

Saya mendapat masalah saat mencoba menampilkan tampilan kamera di dalam popover. Di bawah iOS6 ini tidak masalah tetapi di iOS7 saya mendapat pesan

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.

demikian juga.

Namun, setelah saya mengubah presentasi tampilan kamera ke layar penuh seperti yang dijelaskan dalam Mengambil Gambar dan Film, Perpustakaan Pengembang iOS semuanya berjalan baik lagi dan pesan tidak pernah muncul lagi. Namun saya harus memastikan bahwa tergantung pada mode aplikasi mana (yaitu, menampilkan tampilan kamera atau rol foto), saya harus menutup popover atau pengontrol tampilan setiap kali metode - (void) imagePickerControllerDidCancel: (UIImagePickerController *) pickertersebut dipanggil.

Arne
sumber
3
cameraUI.modalPresentationStyle = UIModalPresentationFullScreen; bekerja untuk saya. Itu satu-satunya hal yang berhasil di sini. Terima kasih!
daveMac
2
Akhirnya! Saya mengalami masalah ini berkali-kali dan tidak pernah menemukan solusi yang baik. Merasa sangat bodoh sekarang karena tidak pernah melihat lebih jauh ke dalam utas pertanyaan - imagePicker.modalPresentationStyle = UIModalPresentationFullScreen; memecahkan ini untuk saya. Ini harus menjadi jawaban yang diterima :)
woobione
6

buat properti

@property (nonatomic) UIImagePickerController *imagePickerController;

Kemudian

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

Ini seharusnya menyelesaikan masalah

Asfanur
sumber
3
picker.modalPresentationStyle = UIModalPresentationCurrentContext; membuat perbedaan bagi saya.
Tn. Berna
1
Ini berfungsi saat pertama kali alat pilih disajikan, tetapi setelah itu peringatan kembali.
daveMac
saya mengkonfirmasi picker.modalPresentationStyle = UIModalPresentationCurrentContext; Memecahkan bagi saya masalah tata letak yang salah di iOS 8
João Nunes
Tidak berfungsi untuk saya - menambahkan ini ke tindakan UIButton di iOS 8.1.3
Andy
Ini tampak menjanjikan, tetapi tidak melakukan apa pun bagi saya untuk masalah pemotretan DAN menampilkan bingkai yang tidak berguna di sekitar sebagian gambar setelah foto diambil.
seri ..
4

Saya menggunakan kode ini untuk mengatasi masalah:

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];
}
Germán Marquès
sumber
1
Sementara idenya bekerja dalam teori, sayangnya kontrol yang ditampilkan tidak berfungsi atau muncul dengan benar.
daveMac
Dan itu juga tidak menghilangkan peringatan (setidaknya bagi saya)
Ege Akpinar
3

Saya memiliki masalah yang sama dan menemukan pemecahannya. Menurut saya, kesalahan itu terkait dengan orientasi aplikasi Anda. Aplikasi saya hanya menggunakan mode lanskap, tetapi UIImagePickerController menggunakan mode potret. Saya menambahkan blok try-catch ke main.m, dan mendapatkan pengecualian nyata:

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

Bagaimana saya mengatasi masalah ini:

1) Periksa kembali orientasi perangkat di Target-> Umum, atau file .plist: Orientasi antarmuka yang didukung: Lanskap kiri, Lanskap kanan.

2) Tambahkan AppDelegate.m:

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

Setelah langkah ini UIImagePickerController berfungsi dengan baik, tetapi viewcontrollers saya dapat diputar ke mode potret. Jadi, untuk mengatasi ini:

3) Buat kategori untuk UINavigationController, (didukungInterfaceOrientations dipindahkan dari UIViewController ke UINavigationController di iOS6):

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

Solusi ini berfungsi dengan baik di iOS 6.0, 6.1, 7.0. Semoga ini membantu.

Roman Ermolov
sumber
1
Saya sedang memperbaiki aplikasi mode potret yang memberikan kesalahan yang disebutkan dalam OP. Jadi tampaknya solusi Anda tidak dapat diterapkan secara universal.
JohnK
Apakah Anda mencoba menambahkan blok try-catch ke main.m dan print exception dan stacktrace?
Roman Ermolov
Seperti ini ?
JohnK
@JohnK ya, seperti ini.
Roman Ermolov
3

Saya mendapatkan kesalahan ini saat membuat aplikasi dengan iOS SDK 6.1, target penyebaran iOS 6.1 dan menjalankan aplikasi pada iPhone yang didukung iOS 7. Aplikasi tidak mogok tetapi UIViewController shouldAutorotatemetode penerapan membantu saya menghapus pesan kesalahan.

- (BOOL)shouldAutorotate {
    return YES;
}
Grigori A.
sumber
3

Saya mengalami masalah yang sama ketika mencoba memodifikasi aplikasi demo yang disertakan dengan Avirary SDK , di aplikasi demo, aplikasi ini hanya dapat mengedit foto yang diambil dari rol kamera. Untuk mencoba mengedit foto dengan mengambil dari kamera, saya menambahkan kode berikut terlebih dahulu di file 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];
        }
    }
}

Kemudian ketika saya menjalankan aplikasi, kesalahan terjadi:

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.

Untuk mengatasi error ini, ubah delegasi UIImagePicker di file UIViewContooler.m Anda seperti yang ditunjukkan di bawah ini:

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

}    

Kemudian kesalahan menghilang dan aplikasi berfungsi!

Tony
sumber
1

Coba ini, gunakan

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

dan fungsi

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

untuk menggantikan. [self presentModalViewController:imagePicker animated:YES]; dan sebab buat imagePickersebagai variabel global.

JerryZhou
sumber
1

Inilah yang memperbaikinya untuk saya di aplikasi saya, ymmv

yang pertama adalah aplikasi iPhone - iPad

di appname-Info.plist. dalam Orientasi antarmuka yang didukung (iPad) menunjukkan 4 orientasi.

dalam orientasi antarmuka yang Didukung menunjukkan 3 orientasi. Saya menambahkan yang keempat dan menjalankan aplikasi, tidak ada keluaran debug.

Semoga ini membantu.

pengguna1045302
sumber
0

Saya baru saja mengalami masalah yang sama. Dalam kasus saya, masalahnya adalah saya memiliki beberapa kode non-ARC dan saya telah memigrasikannya ke ARC. Ketika saya melakukan migrasi, saya tidak memiliki referensi kuat ke UIImagePickerControllerdan itulah alasan kecelakaan itu.

Semoga membantu :)

arturgrigor
sumber
0

Saya memiliki masalah yang sama di iOS 8, Tetapi Akses Kamera Nonaktifkan di dalam Pengaturan -> Privasi untuk Aplikasi saya. Hanya Mengaktifkannya, dan Berhasil.

BhushanVU
sumber
0

Saya menghabiskan waktu lama untuk mencoba menemukan solusinya, dan yang mengejutkan saya telah menemukannya pada akhirnya dan itu sangat lucu begitu saya menemukannya.

Inilah yang akan Anda lakukan untuk mengambil gambar yang Anda pilih dan melanjutkan kerja :)

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

Ya, untuk mengatasi masalah ini, Anda hanya perlu menutup alat pilih secara normal seperti yang terlihat seperti pesan ini: "Memotret tampilan yang belum dirender menghasilkan snapshot kosong. Pastikan tampilan Anda telah dirender setidaknya sekali sebelum snapshot atau snapshot setelah pembaruan layar. " menghentikan alat pilih menjadi responsif tetapi Anda dapat menutupnya dan mengambil gambar secara normal.

DevSherif
sumber
0

Dalam kasus saya, itu terkait dengan perubahan tata letak: VC yang menampilkan UIImagePickerViewControllermemiliki bilah status tersembunyi, tetapi UIImagePickerViewControllerbelum.

Jadi, saya menyelesaikannya dengan menyembunyikan bilah status di UIImagePickerViewControllerseperti yang ditunjukkan dalam jawaban ini .

kanobius
sumber
-1

Tidak langsung menjawab pertanyaan Anda, tetapi Anda menyebutkan bahwa Anda memiliki peringatan memori, Anda mungkin menyimpan gambar mentah di properti yang dapat menyebabkan peringatan memori. Ini karena gambar mentah membutuhkan sekitar 30MB memori. Saya melihat peringatan memori serupa saat menguji aplikasi di iOS6 yang ada di seri iPhone 4. Saya masih mendapat peringatan ini ketika perangkat ditingkatkan ke iOS7. Tidak ada peringatan memori saat menguji pada seri iPhone 5 di iOS7.

DevC
sumber
-5

Berubah

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

untuk

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

memperbaiki masalah untuk saya.

Yuki
sumber