내 아이폰의 애플 리케이션이 특정의 스크린 샷이 걸릴 수 있는지 궁금 UIView
A와를 UIImage
.
이 코드를 시도했지만 빈 이미지 만 있습니다.
UIGraphicsBeginImageContext(CGSizeMake(320,480));
CGContextRef context = UIGraphicsGetCurrentContext();
[myUIView.layer drawInContext:context];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
myUIView
320×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:
방법을 대신 사용하십시오 .
답변
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 클래스에 넣을 수 있습니다.