programing

UIImagePickerController 오류: 렌더링되지 않은 보기를 스냅샷하면 iOS 7에서 스냅샷이 비어 있습니다.

linuxpc 2023. 6. 15. 21:37
반응형

UIImagePickerController 오류: 렌더링되지 않은 보기를 스냅샷하면 iOS 7에서 스냅샷이 비어 있습니다.

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에서만 발생합니다.

누가 단서를 잡았습니까?

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

애플의 포토피커 샘플 코드 프로젝트에서도 이 오류가 나타났습니다.

저는 아이폰 4에서 Xcode Version 5.0과 iOS 7.0.3을 사용하고 있었습니다.

재생산 단계:

  1. https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html 에서 Apple의 PhotoPicker 샘플 프로젝트를 다운로드하십시오.

  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. Camera 아이콘을 클릭하여 Camera 모드에서 UIImagePickerController를 엽니다.

  7. 콘솔 출력을 봅니다.

콘솔 출력

PhotoPicker [240:60b] 렌더링되지 않은 보기를 스냅샷하면 빈 스냅샷이 생성됩니다.화면 업데이트 후 스냅샷 또는 스냅샷을 만들기 전에 보기가 한 번 이상 렌더링되었는지 확인합니다.

CameraControls 속성 표시

이 문제는 이 값이 YES(기본값)일 때 발생합니다.

이 값을 아니요로 설정하면 메시지가 제거됩니다.

버그 리포트

저는 방금 애플에 버그 보고서를 제출했습니다.

저는 여러 게시물에서 제안된 많은 제안을 시도했지만 만족스러운 해결 방법을 찾지 못했습니다.

포퍼 안에 카메라 뷰를 표시하려고 했을 때 문제가 발생했습니다.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호출되었습니다.

재산을 조성합니다.

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

이것이 문제를 해결할 것입니다.

이 코드를 사용하여 문제를 해결했습니다.

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

저도 같은 문제가 있어서 해결책을 찾았습니다.저는 그 오류가 당신의 애플리케이션 방향과 관련이 있다고 생각합니다.내 응용 프로그램은 가로 모드만 사용하지만 UIImagePickerController는 세로 모드를 사용합니다.main.m에 try-catch 블록을 추가하면 실제 예외가 발생합니다.

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

이 문제를 해결하는 방법:

Target->General 또는 .plist 파일에서 장치 방향을 다시 확인합니다.지원되는 인터페이스 방향: 왼쪽 가로, 오른쪽 가로.

AppDelegate를 추가합니다.m:

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

이 단계가 끝나면 UIImagePickerController가 올바르게 작동하지만 내 보기 컨트롤러를 세로 모드로 회전할 수 있습니다.이 문제를 해결하기 위해:

UI Navigation Controller 범주 생성(지원됨)iOS6)에서 인터페이스 방향이 UIViewController에서 UINavigationController로 이동됨:

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

이 솔루션은 iOS 6.0, 6.1, 7.0에서 올바르게 작동합니다. 도움이 되길 바랍니다.

6 대상 iPhone에서 때 이 합니다. iOS SDK 6.1은 iOS 6.1과 iOS 7과의 차이점을 보여줍니다.는 않지만 중인 앱중단않현구만지이UIViewController shouldAutorotatemethod는 오류 메시지를 제거하는 데 도움이 됩니다.

- (BOOL)shouldAutorotate {
    return YES;
}

Avirary SDK와 함께 제공되는 데모 앱을 수정하려고 할 때도 같은 문제가 있었습니다. 데모 앱에서는 카메라 롤에서 선택한 사진만 편집할 수 있습니다.카메라에서 캡처하여 사진을 편집하기 위해 먼저 UIView controller.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.

오류를 해결하려면 아래와 같이 UIViewController.m 파일에서 UIImagePicker 대리인을 수정합니다.

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

}    

그러면 오류가 사라지고 앱이 작동합니다!

사용해 보십시오.

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

및 기능

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

대체할 수 있습니다. [self presentModalViewController:imagePicker animated:YES];그리고 대의명분으로imagePicker전지구적 변수로서.

이것이 내 앱에서 나를 위해 그것을 고친 것이다, ymmv.

우선 아이폰 - 아이패드 앱입니다.

appname-Info.plist에 있습니다.지원되는 인터페이스 방향(iPad)에서 4개의 방향이 표시되었습니다.

지원되는 인터페이스 방향에서 3개의 방향이 표시되었습니다.네 번째를 추가하고 앱을 실행했는데 디버깅 출력이 없습니다.

이게 도움이 되길 바랍니다.

방금 같은 문제가 발생했습니다.제 경우 문제는 비 ARC 코드가 있어서 ARC로 마이그레이션한 것입니다.마이그레이션을 수행했을 때, 저는 다음에 대한 강력한 언급을 가지고 있지 않았습니다.UIImagePickerController그리고 그것이 추락의 원인이었습니다.

도움이 되길 바랍니다 :)

iOS 8에서도 동일한 문제가 있었지만, 카메라 액세스가 내부 설정에서 비활성화되었습니다.--> 제 앱의 개인 정보 보호.방금 활성화했고, 작동했습니다.

저는 해결책을 찾기 위해 오랜 시간을 보냈고, 놀랍게도 마지막에 발견했고, 발견한 후에는 매우 재미있었습니다.

당신이 선택한 이미지를 검색하고 작업을 재개하기 위해 할 일은 다음과 같습니다 :)

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

예, 이 문제를 해결하려면 다음과 같은 메시지가 표시되므로 일반적으로 선택기를 해제하면 됩니다. "스냅샷으로 렌더링되지 않은 보기를 스냅샷으로 만들면 빈 스냅샷이 생성됩니다."화면 업데이트 후 스냅샷 또는 스냅샷을 만들기 전에 보기가 한 번 이상 렌더링되었는지 확인하십시오."는 선택기의 응답을 중지하지만 선택을 해제하고 이미지를 정상적으로 검색할 수 있습니다.

나의 경우, 그것은 레이아웃 변경과 관련이 있었습니다: VC는 다음을 제시합니다.UIImagePickerViewController상태 표시줄이 숨겨져 있지만UIImagePickerViewController안 했어요

그래서 상태 표시줄을 숨긴 채 해결했습니다.UIImagePickerViewController 답변에 나와 있는 것처럼.

질문에 직접 대답하지는 않았지만 메모리 경고가 있다고 언급했습니다. 원시 이미지를 속성에 저장하고 있어 메모리 경고가 발생할 수 있습니다.이는 원시 이미지가 약 30MB의 메모리를 차지하기 때문입니다.iPhone 4 시리즈에 있는 iOS6에서 앱을 테스트할 때 비슷한 메모리 경고를 발견했습니다.iOS7로 업그레이드할 때도 이 경고를 받았습니다.iOS7에서 iPhone 5 시리즈에서 테스트할 때 메모리 경고가 없습니다.

변화하는

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

로.

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

문제를 해결해 주었습니다.

언급URL : https://stackoverflow.com/questions/18890003/uiimagepickercontroller-error-snapshotting-a-view-that-has-not-been-rendered-re

반응형