[ios] UIView의 스크린 샷을 어떻게 찍습니까?

내 아이폰의 애플 리케이션이 특정의 스크린 샷이 걸릴 수 있는지 궁금 UIViewA와를 UIImage.

이 코드를 시도했지만 빈 이미지 만 있습니다.

UIGraphicsBeginImageContext(CGSizeMake(320,480));
CGContextRef context = UIGraphicsGetCurrentContext();
[myUIView.layer drawInContext:context];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

myUIView320×480 크기이며 일부 하위 뷰가 있습니다. 이를 수행하는 올바른 방법은 무엇입니까?



답변

나는 당신이 원하는 renderInContext것이 아니라고 생각합니다 drawInContext. drawInContext는 더 많은 메소드입니다.

라이브 뷰에서 이것을 사용하려고 시도했을 때 특히 1 년 정도 전에 모든 뷰에서 작동하지 않을 수도 있습니다.


답변

iOS 7에는 현재 그래픽 컨텍스트에 뷰 계층을 그릴 수있는 새로운 방법이 있습니다. UIImage를 매우 빠르게 얻는 데 사용할 수 있습니다.

UIView뷰를 다음과 같이 얻기 위해 카테고리 메소드를 구현 했습니다 UIImage.

- (UIImage *)pb_takeSnapshot {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [UIScreen mainScreen].scale);

    [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];

    // old style [self.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

기존 renderInContext:방법 보다 훨씬 빠릅니다 .

참조 : https://developer.apple.com/library/content/qa/qa1817/_index.html

SWIFT 업데이트 : 동일한 기능을 수행하는 확장 프로그램 :

extension UIView {

    func pb_takeSnapshot() -> UIImage {
        UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.mainScreen().scale)

        drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)

        // old style: layer.renderInContext(UIGraphicsGetCurrentContext())

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

스위프트 3 업데이트

    UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.main.scale)

    drawHierarchy(in: self.bounds, afterScreenUpdates: true)

    let image = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return image


답변

스크린 샷 또는 UIView 의 키 창 을 캡처해야합니다 . UIGraphicsBeginImageContextWithOptions를 사용하여 Retina Resolution 에서이를 수행 하고 스케일 매개 변수를 0.0f로 설정할 수 있습니다 . 항상 기본 해상도 (iPhone 4 이상의 레티 나)로 캡처합니다.

이것은 전체 화면 스크린 샷 (키 창)을 수행합니다.

UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
CGRect rect = [keyWindow bounds];
UIGraphicsBeginImageContextWithOptions(rect.size,YES,0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
[keyWindow.layer renderInContext:context];   
UIImage *capturedScreen = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

이 코드는 기본 해상도로 UIView를 캡처합니다.

CGRect rect = [captureView bounds];
UIGraphicsBeginImageContextWithOptions(rect.size,YES,0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
[captureView.layer renderInContext:context];   
UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

이렇게하면 UIImage를 필요한 경우 앱의 문서 폴더에 jpg 형식의 95 % 품질로 저장합니다.

NSString  *imagePath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/capturedImage.jpg"]];    
[UIImageJPEGRepresentation(capturedImage, 0.95) writeToFile:imagePath atomically:YES];


답변

iOS7부터 기본 방법은 다음과 같습니다.

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates

위의 메서드를 호출하면 현재 뷰의 내용을 비트 맵 이미지로 직접 렌더링하는 것보다 빠릅니다.

흐림과 같은 그래픽 효과를 스냅 샷에 적용하려면이 drawViewHierarchyInRect:afterScreenUpdates:방법을 대신 사용하십시오 .

https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html


답변

iOS 10의 새로운 API가 있습니다

extension UIView {
    func makeScreenshot() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: self.bounds)
        return renderer.image { (context) in
            self.layer.render(in: context.cgContext)
        }
    }
}


답변

UIView가 Swift에서 스크린 샷을 찍을 수있는 유용한 확장 프로그램을 만들었습니다.

extension UIView{

var screenshot: UIImage{

    UIGraphicsBeginImageContext(self.bounds.size);
    let context = UIGraphicsGetCurrentContext();
    self.layer.renderInContext(context)
    let screenShot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return screenShot
}
}

사용하려면 다음을 입력하십시오.

let screenshot = view.screenshot


답변

- (void)drawRect:(CGRect)rect {
  UIGraphicsBeginImageContext(self.bounds.size);    
  [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
  UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);  
}

이 메소드는 Controller 클래스에 넣을 수 있습니다.