iOS 8 Anlık görüntüsünün oluşturulmamış olması boş bir anlık görüntüyle sonuçlanır


228

İOS 8'de şu ana kadar kameradan görüntü yakalamada sorun yaşıyorum

UIImagePickerController *controller=[[UIImagePickerController alloc] init];
controller.videoQuality=UIImagePickerControllerQualityTypeMedium;
controller.delegate=(id)self;
controller.sourceType=UIImagePickerControllerSourceTypeCamera;
[self presentViewController:controller animated:YES completion:nil];

Ancak iOS 8'de bunu alı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.

Bu yazı ile sağlanan çözümü denedim

@property (strong,nonatomic)UIImagePickerController *controller;

_controller=[[UIImagePickerController alloc] init];
_controller.videoQuality=UIImagePickerControllerQualityTypeMedium;
_controller.delegate=(id)self;
_controller.sourceType=UIImagePickerControllerSourceTypeCamera;
_[self presentViewController:controller animated:YES completion:nil];

ve bu

...
controller.modalPresentationStyle=UIModalPresentationFullScreen;
or
controller.modalPresentationStyle=UIModalPresentationCurrentContext;
...

ve bu

double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [self presentViewController:controller animated:YES completion:nil];
});

ve bu

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

ve bu

[self presentViewController:controller animated:YES completion:^{

}];

Herhangi bir fikir?


3
Aynı sorunu var ve daha bu hata benim app kez zaman zaman çöker. Umarım 8.0.2 güncellemesi bu hatayı düzeltir. Uygulamamı iOS7'de çalıştırdığımda aptal uyarılar olmadan cazibe gibi çalışıyor. Görünüşe göre iOS 8'in istikrar için uzun yolu var.
NCFUSN

9
8.0.2 güncellemesi ile bu sorun devam ediyor
ArdenDev

2
Aynı sorunu yaşıyordum. Fotoğrafı çektikten sonra, başka bir iş parçacığında biraz işlem yapıyordum. Kodu ana iş parçacığına taşıdıktan sonra her şey yolundaydı. Yani, daha önce benim kod: dispatch_async(dispatch_get_main_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{hangi ben değiştidispatch_async(dispatch_get_main_queue(), ^{
mikeyq6

9
Raptor

12
İOS 9'da da olur.
Sebyddd

Yanıtlar:


131

Bunun iOS 8.0'daki bir hata olduğundan eminim. UIImagePickerControllerYukarıda yaptığınız gibi sunmaya çalışmaktan başka bir şey yapmayan en basit POC uygulamalarıyla tekrarlanabilir . Dahası, görüntü seçiciyi / kamerayı görüntülemek için bence alternatif bir model yok. Hatta Apple'ın UIImagePickerController örnek uygulamasını kullanarak indirebilir , çalıştırabilir ve kutudan aynı hatayı oluşturabilirsiniz.

Bununla birlikte, işlev hala benim için çalışıyor. Uyarı / hata dışında, uygulamanızın çalışmasıyla ilgili sorunlarınız mı var?


2
Evet muhtemelen bir hata, kod da benim için iyi çalışıyor.
souvickcse

4
@souvickcse Bu hatayla da karşılaşıyorum. Ne zaman gerçekleşirse, yeni bir resim çekildikten sonra açılan görüntü önizlemesi tamamen siyahtır. Ancak, ekranın altındaki "Tekrar Al" ve "Fotoğrafı Kullan" düğmeleri görünmeye devam eder ve düzgün çalışır. Aynı davranışa tanık oluyor musunuz?
Barry Beerman

3
@souvickcse Burada bulunan en son telefon kamera eklentisi taban çizgisini kullanıyorum: github.com/apache/cordova-plugin-camera . Bir iPhone 5 üzerinde çalışan iOS 7.1 ile her şey iyi çalışıyor, ancak bir iPhone 6'da iOS 8'i kullanarak düzgün çalışmasını sağlamanın bir yolunu bulamıyorum.
Barry Beerman

2
Aynı benim için iOS8.1 finali
fvisticot

4
IOS 9'da hala mevcut
Başrahibe

45

Birkaç saat boyunca bu sorunla mücadele ediyordum, ilgili her konuyu okudum ve cihazımın gizlilik ayarları altında, uygulamamın kamera erişimine engellendiği için hatanın neden olduğunu öğrendim !!! Asla kameraya erişim engellendi ve nasıl engellendi bilmiyorum ama bu sorun oldu!


4
Gerçekten senin için işe yarayıp yaramadığından emin değilim, ama benim için işe yaramadı. Umarım @KevinH doğrudur.
Deepak Thakur

4
Hayır, benim durumumda bu uygulama için kamera erişimi AÇIK olarak işaretlendi. Ancak bunun ayarlardan da olsa dolaylı olarak kaynaklanabileceğine inanıyorum: ayarlardaki değişiklikler bazen hemen etkili olmuyor, cupertino'daki bir kişi bir yerde senkronize etmek için bir çağrıyı optimize
etmeliydi

Bu öneri sorunu benim için çözdü. Uygulamamda kamera seçici geldiğinde daha önce "İzin Verme" ye dokunmuştum. Kameraya her eriştiğimde bana soracağını düşündüm, ama olmadı. Ayarlar> Gizlilik> Kamera'ya gitmem ve uygulamam için kaydırıcıyı açmam gerekiyordu. Sonra düzgün çalıştı. Her seferinde sormamak için Apple'ın sorta aptal gibi görünüyor ...
John Contarino

tam olarak, bazen bu tür hatalar için ortaya çıkan sorunu düşünemiyoruz. thx buddy çok yararlı
Mr.Javed Multani

En iyi seçenek, kapasitenin etkin olup olmadığını tespit etmek için kamerayı kullanmadan önce ve değilse, ayarlarda kamera etkinleştirilene kadar fotoğraf çekmenin kullanılamayacağı konusunda kullanıcıyı uyarır. İOS 10'da, kullanıcıyı belirli uygulama ayarlarına göndermek mümkündür (iOS 8'den önce mümkün, ancak doğru hatırlamıyorsam iOS 8 ve 9'da mümkün değil).
kindaian

33

@ Greg'in yukarıdaki cevabı hakkında yorum yapmak için yeterli itibar puanım yok, bu yüzden gözlemlerimi buraya ekleyeceğim. Hem iPad hem de iPhone için bir Swift projem var. Benim ana görünüm denetleyicisi içinde bir yöntem var (ilgili bit aşağıda). Bunu bir telefonda test ettiğimde, her şey düzgün çalışıyor ve hiçbir uyarı oluşturulmuyor. Bir iPad'de çalıştırdığımda her şey düzgün çalışıyor, ancak görünümün anlık görüntüsü hakkında uyarı görüyorum. İlginç olan, popover denetleyicisini kullanmadan bir iPad'de çalıştırdığımda, her şeyin uyarı olmadan düzgün çalışmasıdır. Ne yazık ki Apple, kamera kullanılmıyorsa resim seçicinin iPad'deki bir popover içinde kullanılması gerektiğini zorunlu kılıyor.

    dispatch_async(dispatch_get_main_queue(), {
        let imagePicker: UIImagePickerController = UIImagePickerController();
        imagePicker.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum;
        imagePicker.mediaTypes = [kUTTypeImage];
        imagePicker.allowsEditing = false;
        imagePicker.delegate = self;

        if(UIDevice.currentDevice().userInterfaceIdiom == .Pad){ // on a tablet, the image picker is supposed to be in a popover
            let popRect: CGRect = buttonRect;
            let popover: UIPopoverController = UIPopoverController(contentViewController: imagePicker);
            popover.presentPopoverFromRect(popRect, inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Up, animated: true);
        }else{
            self.presentViewController(imagePicker, animated: true, completion: nil);
        }
    });

Görünüşe göre bu doğru bir öneri çünkü iOS 9.0.2'de bile bu hata mesajını alıyorum. Yalnızca iPhone'um var ve iPad Mini'mde çalıştırdığımda görüntü seçiciyi sunarken bu mesajı görüyorum. Nedense iOS iPad uygulamasını çalıştırdığımı düşünüyor.
John Tracid

16

UIImagePickerController presentViewController çağırdıktan sonra bu koştu: geri arama UIAlertView delege. PresentViewController iterek sorunu çözdüm: dispatch_async kullanarak geçerli yürütme izleme çağrı.

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    dispatch_async(dispatch_get_main_queue(), ^{
        UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
        imagePickerController.delegate = self;

        if (buttonIndex == 1)
            imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        else
            imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;

        [self presentViewController: imagePickerController
                           animated: YES
                         completion: nil];
    });
}

Bunu benim için çözen şey buydu. Bir UIAlertAction eylem bloğu içinden UIImagePickerController sunmaya çalışıyordum.
josefdlange

alertView kullanımdan kaldırıldı, async'i bir UIAlertViewController eyleminin içinde kullanırsam bu işe yarar mı?
DrPatience

@DrPatience Tabii. dispatch_async istediğiniz yerde çalışır. Gerekli olduğunu bilmiyorum (kodunuza bağlı olacaktır). GCD'de okuyun - çok fazla kullanım alanı vardır.
greg

12

Bazı görünümleri canlandırırken bu sorunu yaşadım ve uygulama arka plan moduna geçip geri dönecekti. Aktif bir bayrak ayarlayarak hallettim. İçinde HAYIR olarak ayarladım

- (void)applicationWillResignActive:(UIApplication *)application

ve EVET

- (void)applicationDidBecomeActive:(UIApplication *)application

ve görüşlerimi buna göre canlandırın veya canlandırmayın. Sorunu hallettim.


11

Kullanıcıya kamera ile fotoğraf çekmek veya kitaplıktan birini kullanmak için seçenek veren bir UIAlertControllerStyleActionSheet vardı.

Hata mesajında ​​sembolik bir kesme noktası denedim resim açıklamasını buraya girin

Bu bana hata sunum sırasında bir UICollectionView stajyer kullanımı tarafından üretilen gösterdi

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

resim açıklamasını buraya girin

Sunmadan önce çerçeveyi hızlı bir şekilde ayarlayarak bunu düzelttim

[alert setPreferredContentSize: alert.view.frame.size];

İşte hatasız çalışan tam yöntem

-(void)showImageSourceAlertFromSender:(id)sender{
UIButton *senderButton = (UIButton*)sender;
UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *cameraAction = [UIAlertAction actionWithTitle:@"Camera" style:UIAlertActionStyleDefault
                                                     handler:^(UIAlertAction *action) {
                                                         [self takePhoto];
                                                     }];
UIAlertAction *libraryAction = [UIAlertAction actionWithTitle:@"Library" style:UIAlertActionStyleDefault
                                                      handler:^(UIAlertAction *action) {
                                                          [self selectPhotoFromLibraryFromSender:sender];
                                                      }];
[alert addAction:cameraAction];
[alert addAction:libraryAction];
alert.popoverPresentationController.delegate = self;
alert.popoverPresentationController.sourceRect = senderButton.frame;
alert.popoverPresentationController.sourceView = self.view;

[alert setPreferredContentSize: alert.view.frame.size];

[self presentViewController:alert animated:YES completion:^(){
}];}

10

viewGörünüm denetleyicisini sunmadan önce özelliğe başvurarak "Bir görünümün anlık görüntüsünü alma" uyarısını sessizleştirebilirsiniz . Bunu yapmak görünümün yüklenmesine neden olur ve iOS'un anlık görüntüyü çekmeden önce oluşturmasına izin verir.

UIAlertController *controller = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
controller.modalPresentationStyle = UIModalPresentationPopover;
controller.popoverPresentationController.barButtonItem = (UIBarButtonItem *)sender;

... setup the UIAlertController ... 

[controller view]; // <--- Add to silence the warning.

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

Bu neredeyse inanılmaz faydalı bir ipucu. Teşekkür ederim!!!! (Benim durumumda, hala uyarıyı alıyorum, ancak uygulama artık
çökmüyor

Ancak, bir eklediğimde cameraOverlayView, bu ipucunu uygulasam bile maalesef hala bu sorunu yaşıyorum.
Fattie

8

Görüntü yakalandıktan sonra siyah önizlemeyle ilgili bir sorun gören herkes için, UIPickerController gösterildikten sonra durum çubuğunu gizlemek sorunu çözüyor gibi görünüyor.

UIImagePickerControllerSourceType source = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypeSavedPhotosAlbum;
UIImagePickerController *cameraController = [[UIImagePickerController alloc] init];
        cameraController.delegate = self;
        cameraController.sourceType = source;
        cameraController.allowsEditing = YES;
        [self presentViewController:cameraController animated:YES completion:^{
            //iOS 8 bug.  the status bar will sometimes not be hidden after the camera is displayed, which causes the preview after an image is captured to be black
            if (source == UIImagePickerControllerSourceTypeCamera) {
                [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
            }
        }];

1
tamamen benim gün kurtardı! Yukarıdaki yöntemleri denedim, hiçbiri çalıştı. ve bu çalıştı
Stan

Çözüm çalışmıyor. Ben o zaman StatusBar zaten Gizli bir görüntü yakalamak zaman düşünüyorum.
Mihir Oza

5

Aynı sorunu buldum ve her şeyi denedim. İki farklı uygulamam var, biri hedef-C ve diğeri hızlı - her ikisinin de aynı sorunu var. Hata mesajı hata ayıklayıcıda gelir ve ilk fotoğraftan sonra ekran kararır. Bu sadece iOS> = 8.0'da olur, açıkçası bir hatadır.

Zor bir çözüm buldum. İmagePicker.showsCameraControls = false ile kamera kontrollerini kapatın ve eksik düğmeleri olan kendi bindirmenizi görüntüleyin. Bunun nasıl yapılacağı konusunda çeşitli öğreticiler vardır. Garip hata mesajı kalıyor, ancak en azından ekran kararmıyor ve çalışan bir uygulamanız var.


Sizinle aynı sorunu yaşadım, aşağıdaki cevabımı görün.
Dan

5

Bu yerleşik ImagePickerController hatası olabilir. Kodum çalışıyor, ancak bazen iPhone 6 Plus'ta çöküyor.

Diğer cevaplar tarafından önerilen tüm çözümleri denedim ama şans yoktu. Nihayet JPSImagePickerController'a geçtikten sonra sorun çözüldü .


3

Her şeyi denedim, sorunum kamera ve fotoğraf kütüphanesi için görüntü seçicinin gösterildikten hemen sonra kaybolmasıydı. Aşağıdaki satırla çözdüm (hızlı)

imagePicker.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext

3

Bunun iOS 8.0'daki bir hata olduğundan eminim. Yukarıda yaptığınız gibi bir UIImagePickerController sunmaya çalışmaktan başka bir şey yapmayan en basit POC uygulamalarıyla tekrarlanabilir. Dahası, görüntü seçiciyi / kamerayı görüntülemek için bence alternatif bir model yok. Hatta Apple'ın UIImagePickerController örnek uygulamasını kullanarak indirebilir, çalıştırabilir ve kutudan aynı hatayı oluşturabilirsiniz.

Bununla birlikte, işlev hala benim için çalışıyor. Uyarı / hata dışında, uygulamanızın çalışmasıyla ilgili sorunlarınız mı var?


3

Eğer kullanırsak UIImagePickerControllerÖzelliğini bir özellik olarak bu uyarı kaybolacaktır.UIImagePickerControllerEğer UIImagePickerControllerbir fonksiyonun içinde somutlaştırıyorsak, sonucunu kullanmadığımızı varsayalım .


2

Bu yöntemi çağırmak benim için çalıştı. Görüşünüzü sunduktan sonra yerleştirin.

[yourViewBeingPresented.view layoutIfNeeded];

1

Aynı problemle de karşılaşıyorum ve kameranın mevcut olup olmadığını kontrol ederek çözdüm:

BOOL cameraAvailableFlag = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
    if (cameraAvailableFlag)
        [self performSelector:@selector(showcamera) withObject:nil afterDelay:0.3];

1
isSourceTypeAvailable, uygulamam için kameraya erişimi reddetmeme rağmen true değerini döndürüyor. Kamera erişimi reddedilirse ekran kararır.
καrτhικ

1

Bu sorunla karşılaştım. Kamerayı çağırdığımızda ve görüntülemeleri bıraktığımızda bu sorun ortaya çıktı. Bir örnek için bir kamera çağırın ve view nil değerini viewDidDisappear yönteminde ayarlayın, kamera olayı için geri arama olmadığından bu hata gelecektir. Bu hata için de bu durumdan emin olun.


1

Aynı hatayı aldım, kamera açarken konsolda feryat mesajı alıyorum.

'Oluşturulmamış bir görünümün anlık görüntüsü boş bir anlık görüntüyle sonuçlanır. Ekran güncellemelerinden sonra anlık görüntü veya anlık görüntü görüntülemeden önce görünümünüzün en az bir kez oluşturulduğundan emin olun. '

Benim için sorun Info.plist dosyasındaki Bundle görünen adıyla oldu.Bazı nasıl boştu, uygulama adımı oraya koydum ve şimdi iyi çalışıyor. Boş Bundle görünen name.it nedeniyle herhangi bir kamera izin uyarısı almadım görünümün görüntülenmesini engelledi.

sorun görünümde değildi ama izinsiz sunarak. ayarları kontrol edebilirsiniz -> gizlilik -> Kamera, eğer uygulamanız listede yoksa sorun aynı olabilir.


1

Phonegap kullanıyorum, ancak bu iş parçacığı hata mesajı hakkında Googling yaparken ilk olarak geliyor.

Benim için bu sorun, imagetype'ı PNG'ye tanımlayarak ortadan kalktı.

encodingType : Camera.EncodingType.PNG

Yani bütün çizgi şu şekildedir:

 navigator.camera.getPicture(successFunction, failFunction, { encodingType : Camera.EncodingType.PNG, correctOrientation:true, sourceType : Camera.PictureSourceType    .PHOTOLIBRARY, quality: 70, allowEdit : false , destinationType: Camera.DestinationType.DATA_URL});

Kilometreniz değişebilir, ancak bu benim için hile yaptı.


1

Alternatif olarak drawViewHierarchyInRectşunları kullanmayı düşünün :

Swift:

extension UIImage{

    class func renderUIViewToImage(viewToBeRendered: UIView) -> UIImage
    {
        UIGraphicsBeginImageContextWithOptions(viewToBeRendered.bounds.size, true, 0.0)
        viewToBeRendered.drawViewHierarchyInRect(viewToBeRendered.bounds, afterScreenUpdates: true)
        viewToBeRendered.layer.renderInContext(UIGraphicsGetCurrentContext()!)

        let finalImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return finalImage
    }
}

Objective-C:

- (UIImage *)snapshot:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0);
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

Ayrıca bakınız:


0

Benim durumumda (XCode 7 ve iOS 9), UINavigationController"gizli" kullanıyorum, bu yüzden UINavigationControllerDelegatemevcut kameraya veya ruloya eklemek zorundayım ve olması gerektiği gibi çalışıyor! And pickerControllerDelegate.selfhata da göstermiyor!

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.