ข้อผิดพลาด 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];
Bobby

คำตอบ:


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
presentModalViewController เลิกใช้แล้วใน iOS 6 ขอแนะนำให้ใช้ presentViewController ตอนนี้
Gallymon

5
ปัญหาเดียวกันและแก้ไขสำหรับ iOS8
Yauheni Shauchenka

1
ฉันกำลังพยายามทำให้งานนี้จาก UIAertControl - ทางเลือกหนึ่งคือการนำเสนอตัวเลือกรูปภาพสำหรับเบราว์เซอร์รูปภาพซึ่งใช้งานได้ดีและอีกทางเลือกหนึ่งคือนำเสนอสำหรับกล้องถ่ายรูป - สิ่งนี้ไม่ได้ฉันจะสร้างความล่าช้าที่ไหนเมื่อใช้ UIALertController?
SimonTheDiver

3
ฉันไม่เริ่มต้นกล้องใน viewDidAppear / Load ฉันมีมุมมองตารางและฉันเปิดกล้องขึ้นมาเพื่อตอบสนองต่อหนึ่งในตัวเลือกมุมมองตาราง และฉันได้รับข้อความแสดงข้อผิดพลาดนี้ ความคิดใด ๆ ?
Henning

18

ข้อผิดพลาดนี้ยังปรากฏให้ฉันเห็นด้วยโครงการโค้ดตัวอย่าง PhotoPicker ของ Apple

ฉันใช้ 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] การสแนปช็อตมุมมองที่ยังไม่ได้แสดงผลลัพธ์ในสแนปชอตที่ว่างเปล่า ตรวจสอบให้แน่ใจว่ามุมมองของคุณได้รับการแสดงผลอย่างน้อยหนึ่งครั้งก่อนที่จะถ่ายภาพหรือสแนปชอตหลังจากอัปเดตหน้าจอ

showsCameraControls คุณสมบัติ

ปัญหาเกิดขึ้นสำหรับฉันเมื่อมีค่าเป็น YES (ค่าเริ่มต้น)

การตั้งค่านี้เป็นไม่ตัดข้อความ

รายงานข้อบกพร่อง

ฉันเพิ่งยื่นรายงานข้อบกพร่องกับ Apple

ฉันได้ลองใช้คำแนะนำมากมายในโพสต์ต่างๆ แต่ไม่พบวิธีแก้ปัญหาที่น่าพอใจ


1
Apple ตอบกลับคุณอย่างไร? ฉันมีปัญหาเดียวกันและวิธีแก้ไขใน stackoverflow ไม่ทำงาน
heekyu

ฉันยังไม่ได้รับการติดต่อจาก Apple ในเรื่องนี้ ฉันจะโพสต์คำตอบหากได้รับคำตอบจากพวกเขา
Scott Carter

มีข่าวจาก Apple ไหม @ScottCarter
Benjamin Toueg

1
เพิ่งตรวจสอบอีกครั้ง. ไม่มีการดำเนินการใด ๆ กับข้อผิดพลาดแบบเปิดเนื่องจากมีการยื่นฟ้องเมื่อวันที่ 2 พฤศจิกายน 2556
Scott Carter

นี่คือข้อผิดพลาด 15377241 ใน bugreport.apple.com
Scott Carter

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; สร้างความแตกต่างให้กับฉัน
Mr. Berna

1
ใช้งานได้ในครั้งแรกที่มีการนำเสนอเครื่องมือเลือก แต่หลังจากนั้นคำเตือนจะกลับมา
daveMac

ฉันยืนยัน picker.modalPresentationStyle = UIModalPresentationCurrentContext; แก้ปัญหาเลย์เอาต์ผิดใน iOS 8 ให้ฉัน
João Nunes

ไม่ได้ผลสำหรับฉัน - เพิ่มสิ่งนี้ในการดำเนินการ UIButton บน iOS 8.1.3
Andy

สิ่งนี้ดูเหมือนมีแนวโน้ม แต่ไม่ได้ทำอะไรให้ฉันสำหรับปัญหาการถ่ายภาพและแสดงกรอบที่ไร้ประโยชน์รอบ ๆ ส่วนของภาพหลังจากถ่ายภาพแล้ว
วาด ..

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

และมันก็ไม่ได้กำจัดคำเตือนเช่นกัน (อย่างน้อยสำหรับฉัน)
Ege Akpinar

3

ฉันมีปัญหาเดียวกันและพบวิธีแก้ปัญหา ฉันคิดว่าข้อผิดพลาดนั้นเกี่ยวข้องกับการวางแนวแอปพลิเคชันของคุณ แอปพลิเคชันของฉันใช้โหมดแนวนอนเท่านั้น แต่ UIImagePickerController ใช้โหมดแนวตั้ง ฉันเพิ่มบล็อก try-catch ใน main.m และได้รับข้อยกเว้นจริง:

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

ฉันจะแก้ปัญหานี้อย่างไร:

1) ตรวจสอบการวางแนวอุปกรณ์อีกครั้งในไฟล์ Target-> General หรือ .plist: การวางแนวอินเทอร์เฟซที่รองรับ: แนวนอนซ้ายแนวนอนขวา

2) เพิ่มใน AppDelegate.m:

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

หลังจากขั้นตอนนี้ UIImagePickerController ทำงานได้อย่างถูกต้อง แต่ตัวควบคุมมุมมองของฉันสามารถหมุนเป็นโหมดแนวตั้งได้ ดังนั้นเพื่อแก้ปัญหานี้:

3) สร้างหมวดหมู่สำหรับ UINavigationController (supportedInterfaceOrientations ย้ายจาก UIViewController ไปยัง UINavigationController ใน iOS6):

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

โซลูชันนี้ทำงานได้อย่างถูกต้องบน iOS 6.0, 6.1, 7.0 หวังว่านี่จะช่วยได้


1
ฉันกำลังแก้ไขแอพโหมดแนวตั้งที่ให้ข้อผิดพลาดที่กล่าวถึงใน OP ดังนั้นดูเหมือนว่าโซลูชันของคุณใช้ไม่ได้ในระดับสากล
JohnK

คุณพยายามเพิ่ม try-catch block ใน main.m และ print except and stacktrace หรือไม่?
Roman Ermolov

แบบนี้เหรอ?
JohnK

@JohnK ใช่แบบนี้
Roman Ermolov

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

ไม่ได้ตอบคำถามของคุณโดยตรง แต่คุณบอกว่าคุณมีคำเตือนเกี่ยวกับหน่วยความจำคุณอาจกำลังจัดเก็บอิมเมจดิบไว้ในคุณสมบัติซึ่งอาจนำไปสู่การเตือนความจำ เนื่องจากภาพดิบใช้หน่วยความจำประมาณ 30MB ฉันสังเกตเห็นคำเตือนเกี่ยวกับหน่วยความจำที่คล้ายกันเมื่อทดสอบแอปบน iOS6 ซึ่งอยู่ใน iPhone 4 ซีรีส์ ฉันยังคงได้รับคำเตือนนี้เมื่ออุปกรณ์ต่างๆได้รับการอัปเกรดเป็น iOS7 ไม่มีคำเตือนหน่วยความจำเมื่อทดสอบบน iPhone 5 ซีรีส์บน iOS7


-5

กำลังเปลี่ยน

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

ถึง

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

แก้ไขปัญหาให้ฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.