Lỗi UIImagePickerController: Chụp nhanh một chế độ xem chưa được hiển thị dẫn đến ảnh chụp nhanh trống trong iOS 7


103

Tôi chỉ gặp lỗi này trong iOS 7 và ứng dụng bị lỗi. Trong iOS 6, tôi không bao giờ gặp bất kỳ lỗi nào, chỉ một lần cảnh báo bộ nhớ khi mở camera.

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.

Đây là những gì tôi đang làm.

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

[self presentModalViewController:imagePicker animated:YES];

Tôi đã cố gắng trì hoãn presentModalViewController, nhưng tôi vẫn nhận được thông báo tương tự. Sau vài giây (7-10), ứng dụng bị lỗi.

Lỗi này chỉ xuất hiện trong iOS 7.

Có ai có manh mối không?


3
Tôi có cùng một vấn đề. Trên iOS7 UIIMagePickerController không hoạt động nữa.
condor304,

Gọi phương pháp này đã làm việc cho tôi. Đặt nó sau khi trình bày quan điểm của bạn. [yourViewBeingPresented.view layoutIfNeeded];
Bobby

Câu trả lời:


32

Vấn đề trong iOS7 liên quan đến chuyển đổi. Có vẻ như nếu quá trình chuyển đổi trước đó không hoàn tất và bạn khởi chạy một chuyển đổi mới, iOS7 sẽ làm xáo trộn các chế độ xem, trong đó iOS6 dường như quản lý nó một cách chính xác.

Bạn chỉ nên khởi chạy Máy ảnh của mình UIViewControllersau khi chế độ xem đã được Tải và hết thời gian chờ:

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

và đây là mã khởi tạo

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

    [self presentModalViewController:imagePicker animated:YES];
}

1
Điều này dường như hoạt động cho đến nay, tôi đã kiểm tra nó bằng cách chụp 10 bức ảnh lần lượt mà không có vấn đề gì.
DevC

3
presentModalViewController không được dùng nữa trong iOS 6. Bạn nên sử dụng presentViewController ngay bây giờ.
Gallymon

5
Sự cố tương tự và cách khắc phục đối với iOS8.
Yauheni Shauchenka

1
Tôi đang cố gắng thực hiện công việc này từ UIAertControl - một tùy chọn là hiển thị bộ chọn hình ảnh cho trình duyệt ảnh - tùy chọn này hoạt động tốt và tùy chọn còn lại là hiển thị cho máy ảnh - điều này không. một UIALertController?
SimonTheDiver

3
Tôi không khởi tạo máy ảnh trong viewDidAppear / Load. Tôi có chế độ xem bảng và tôi đưa máy ảnh lên để đáp ứng một trong các lựa chọn chế độ xem bảng. Và tôi nhận được thông báo lỗi này. Bất kỳ ý tưởng?
Henning

18

Lỗi này cũng xuất hiện đối với tôi với dự án mã mẫu PhotoPicker của Apple.

Tôi đang sử dụng Xcode Phiên bản 5.0 và iOS 7.0.3 trên iPhone 4.

Các bước để tạo lại:

  1. Tải xuống dự án mẫu PhotoPicker của Apple tại https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html

  2. Trong APLViewController.m bình luận ra dòng 125

    //imagePickerController.showsCameraControls = NO;

  3. Trong APLViewController.m nhận xét ra dòng 130-133

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

  4. Xây dựng và khởi chạy ứng dụng.

  5. Sau khi khởi chạy, hãy xoay thiết bị sang chế độ Ngang.

  6. Nhấp vào biểu tượng Máy ảnh để mở UIImagePickerController ở chế độ Máy ảnh.

  7. Xem đầu ra của bảng điều khiển.

Đầu ra bảng điều khiển

PhotoPicker [240: 60b] Chụp nhanh một chế độ xem chưa được hiển thị dẫn đến một ảnh chụp nhanh trống. Đảm bảo chế độ xem của bạn đã được hiển thị ít nhất một lần trước khi chụp nhanh hoặc sau khi cập nhật màn hình.

thuộc tính showsCameraControls

Sự cố xảy ra đối với tôi khi điều này có giá trị là CÓ (mặc định).

Đặt điều này thành KHÔNG sẽ loại bỏ thông báo.

Báo cáo lỗi

Tôi vừa gửi một báo cáo lỗi với Apple.

Tôi đã thử nhiều đề xuất được đưa ra trong các bài viết khác nhau nhưng vẫn chưa tìm được giải pháp thỏa đáng.


1
Làm thế nào apple trả lời cho bạn? Tôi gặp vấn đề tương tự và các giải pháp trong stackoverflow không hoạt động.
heekyu

Tôi chưa nhận được phản hồi từ Apple về điều này. Tôi sẽ đăng trả lời nếu tôi nhận được phản hồi từ họ.
Scott Carter

Có tin tức gì từ Apple không? @ScottCarter
Benjamin Toueg

1
Chỉ cần kiểm tra lại. Không có hành động nào đối với lỗi mở kể từ khi nó được gửi vào ngày 2 tháng 11 năm 2013.
Scott Carter

Đây là lỗi 15377241 trên bugreport.apple.com
Scott Carter

11

Tôi gặp sự cố khi cố gắng hiển thị chế độ xem camera bên trong cửa sổ bật lên. Dưới iOS6, điều này không có vấn đề gì nhưng trong iOS7, tôi nhận được thông báo

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.

cũng.

Tuy nhiên, sau khi tôi thay đổi bản trình bày của chế độ xem camera thành toàn màn hình như được mô tả trong Chụp ảnh và quay phim, Thư viện nhà phát triển iOS mọi thứ đã trở nên tốt đẹp trở lại và thông báo không bao giờ xuất hiện nữa. Tuy nhiên, tôi phải đảm bảo rằng tùy thuộc vào chế độ mà ứng dụng đang ở (tức là hiển thị chế độ xem camera hoặc cuộn ảnh), tôi phải loại bỏ cửa sổ bật lên hoặc bộ điều khiển chế độ xem bất cứ khi nào phương thức - (void) imagePickerControllerDidCancel: (UIImagePickerController *) pickerđược gọi.


3
cameraUI.modalPresentationStyle = UIModalPresentationFullScreen; làm việc cho tôi. Đó là điều duy nhất đã thành công ở đây. Cảm ơn!
daveMac

2
Cuối cùng! Tôi đã gặp vấn đề này nhiều lần và không bao giờ tìm thấy một giải pháp tốt. Bây giờ cảm thấy thật ngu ngốc vì chưa bao giờ nhìn xuống dưới các chủ đề câu hỏi - imagePicker.modalPresentationStyle = UIModalPresentationFullScreen; đã giải quyết điều này cho tôi. Điều này sẽ là câu trả lời chấp nhận :)
woobione

6

tạo tài sản

@property (nonatomic) UIImagePickerController *imagePickerController;

Sau đó

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

Điều này sẽ giải quyết vấn đề


3
picker.modalPresentationStyle = UIModalPresentationCurrentContext; đã tạo ra sự khác biệt cho tôi.
Ông Berna

1
Nó hoạt động vào lần đầu tiên bộ chọn được hiển thị, nhưng sau đó cảnh báo sẽ quay trở lại.
daveMac

tôi xác nhận picker.modalPresentationStyle = UIModalPresentationCurrentContext; Giải quyết cho tôi vấn đề bố trí sai trong iOS 8
João Nunes

Không hoạt động đối với tôi - đã thêm điều này vào hành động UIButton trên iOS 8.1.3
Andy

Điều này có vẻ đầy hứa hẹn, nhưng không làm được gì đối với tôi đối với vấn đề chụp nhanh VÀ hiển thị một khung hình vô dụng xung quanh một phần của hình ảnh sau khi một bức ảnh được chụp.
đã vẽ ..

4

Tôi đã sử dụng mã này để giải quyết vấn đề:

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
Trong khi ý tưởng hoạt động trên lý thuyết, rất tiếc là các điều khiển được hiển thị không hoạt động hoặc xuất hiện chính xác.
daveMac

Và nó đã không thoát khỏi cảnh báo một trong hai (đối với tôi ít nhất)
Ege Akpinar

3

Tôi có cùng một vấn đề và tìm thấy một giải pháp. Tôi nghĩ, lỗi đó liên quan đến định hướng ứng dụng của bạn. Ứng dụng của tôi chỉ sử dụng chế độ ngang, nhưng UIImagePickerController sử dụng chế độ dọc. Tôi thêm khối try-catch vào main.m và nhận được ngoại lệ thực sự:

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

Cách tôi giải quyết vấn đề này:

1) Kiểm tra lại hướng thiết bị trong tệp Target-> General hoặc .plist: Các hướng giao diện được hỗ trợ: Ngang trái, Ngang phải.

2) Thêm vào AppDelegate.m:

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

Sau bước này, UIImagePickerController hoạt động bình thường, nhưng các bộ điều khiển chế độ xem của tôi có thể được xoay sang chế độ dọc. Vì vậy, để giải quyết điều này:

3) Tạo một danh mục cho UINavigationController, (hỗ trợInterfaceOrientations được chuyển từ UIViewController sang UINavigationController trong iOS6):

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

Giải pháp này hoạt động đúng trên iOS 6.0, 6.1, 7.0. Hi vọng điêu nay co ich.


1
Tôi đang sửa một ứng dụng ở chế độ dọc gây ra lỗi được đề cập trong OP. Vì vậy, có vẻ như giải pháp của bạn không được áp dụng phổ biến.
JohnK

Bạn đã thử thêm khối try-catch vào main.m và in ngoại lệ và stacktrace chưa?
Roman Ermolov

Như thế này ?
JohnK

@JohnK yep, như thế này.
Roman Ermolov

3

Tôi gặp lỗi này khi xây dựng ứng dụng với iOS SDK 6.1, mục tiêu triển khai iOS 6.1 và ứng dụng đang chạy trên iPhone hỗ trợ iOS 7. Ứng dụng không bị lỗi nhưng UIViewController shouldAutorotatephương pháp triển khai giúp tôi loại bỏ thông báo lỗi.

- (BOOL)shouldAutorotate {
    return YES;
}

3

Tôi đã gặp vấn đề tương tự khi cố gắng sửa đổi ứng dụng demo đi kèm với Avirary SDK , trong ứng dụng demo, nó chỉ có thể chỉnh sửa ảnh được chọn từ thư viện ảnh. Để cố gắng chỉnh sửa ảnh bằng cách chụp từ máy ảnh, trước tiên, tôi đã thêm đoạn mã sau vào tệp 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];
        }
    }
}

Sau đó, khi tôi chạy ứng dụng, lỗi xảy ra:

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.

Để giải quyết lỗi, hãy sửa đổi đại biểu UIImagePicker trong tệp UIViewContooler.m của bạn như được hiển thị bên dưới:

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

}    

Sau đó, lỗi đã biến mất và ứng dụng hoạt động!


1

Hãy thử cái này, sử dụng

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

và chức năng

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

thay thế. [self presentModalViewController:imagePicker animated:YES]; và nguyên nhân làm cho imagePickerbiến toàn cục.


1

Đây là những gì đã khắc phục sự cố cho tôi trên ứng dụng của tôi, ymmv

trước hết nó là một ứng dụng iPhone - iPad

trong appname-Info.plist. trong các hướng giao diện được hỗ trợ (iPad) hiển thị 4 hướng.

trong các hướng giao diện được hỗ trợ hiển thị 3 hướng. Tôi đã thêm phần thứ tư và chạy ứng dụng, không có đầu ra gỡ lỗi.

Hi vọng điêu nay co ich.


0

Tôi vừa gặp phải vấn đề tương tự. Trong trường hợp của tôi, vấn đề là tôi có một số mã không phải ARC và tôi đã chuyển nó sang ARC. Khi tôi thực hiện việc di chuyển, tôi không có tham chiếu mạnh mẽ đến UIImagePickerControllervà đó là lý do cho sự cố.

Hy vọng nó giúp :)


0

Tôi gặp sự cố tương tự trong iOS 8, nhưng Quyền truy cập máy ảnh đã bị vô hiệu hóa bên trong Cài đặt -> Quyền riêng tư cho ứng dụng của tôi. Chỉ cần bật nó và nó đã hoạt động.


0

Tôi đã dành nhiều thời gian để cố gắng tìm ra giải pháp, và thật ngạc nhiên là cuối cùng tôi đã tìm thấy nó và thật buồn cười khi tôi phát hiện ra nó.

Đây là những gì bạn sẽ làm để lấy lại hình ảnh bạn đã chọn và tiếp tục hoạt động :)

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

Có, để giải quyết vấn đề, bạn chỉ cần loại bỏ bộ chọn thông thường vì có vẻ như thông báo này: "Chụp nhanh một chế độ xem chưa được hiển thị dẫn đến một ảnh chụp nhanh trống. Đảm bảo chế độ xem của bạn đã được hiển thị ít nhất một lần trước khi chụp nhanh hoặc ảnh chụp nhanh sau cập nhật màn hình. " ngăn bộ chọn phản hồi nhưng bạn có thể loại bỏ nó và truy xuất hình ảnh bình thường.


0

Trong trường hợp của tôi, nó liên quan đến sự thay đổi bố cục: VC trình bày UIImagePickerViewControllerthanh trạng thái có thanh trạng thái bị ẩn, nhưng UIImagePickerViewControllerkhông có.

Vì vậy, tôi đã giải quyết nó ẩn thanh trạng thái UIImagePickerViewControllernhư được hiển thị trong câu trả lời này .


-1

Không trực tiếp trả lời câu hỏi của bạn nhưng bạn đã đề cập rằng bạn có cảnh báo bộ nhớ, bạn có thể đang lưu trữ hình ảnh thô trong một thuộc tính có thể dẫn đến cảnh báo bộ nhớ. Điều này là do hình ảnh thô chiếm khoảng 30 MB bộ nhớ. Tôi nhận thấy cảnh báo bộ nhớ tương tự khi kiểm tra các ứng dụng trên iOS6 trên iPhone 4 series. Tôi vẫn nhận được cảnh báo này khi thiết bị được nâng cấp lên iOS7. Không có cảnh báo bộ nhớ khi thử nghiệm trên iPhone 5 series trên iOS7.


-5

Thay đổi

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

đến

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

đã khắc phục sự cố cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.