iOSでどのようにしてビューのスクリーンショットを取得しますか?


前言
最近SDKのスクリーンショットをしていますが、似たようなシステムのスクリーンショット機能を触発したいです。
UID Viewのcategoryを書いて、これらの方法をカプセル化して簡略化しました。
第一の状況のスクリーンショット
これは最も一般的なスクリーンショットで、一般的なビューにビューを追加する場合には、基本的に使用できます。
ソース:

/**
      
  API       layer OpenGL        
 
 @return      
 */
- (UIImage *)nomalSnapshotImage
{
 UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, [UIScreen mainScreen].scale);
 [self.layer renderInContext:UIGraphicsGetCurrentContext()];
 UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
 
 return snapshotImage;
}
第二の状況のスクリーンショット
いくつかのビューがOpenGLで描画されている場合、上の方法でOpenGLにレンダリングされている部分をカットすることはできません。この場合は改善されたスクリーンショットスキームを使用します。

/**
      OpenGL        
 
 @return      
 */
- (UIImage *)openglSnapshotImage
{
 CGSize size = self.bounds.size;
 UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
 CGRect rect = self.frame;
 [self drawViewHierarchyInRect:rect afterScreenUpdates:YES];
 UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
 
 return snapshotImage;
}
第三の状況のスクリーンショット
いくつかの特殊なLayer(例えば、AVCapture Video Preview LayerとAVSampleBuffer DisplayLayer)があるViewに追加された後、上のいくつかの方法でLayer上のコンテンツを切り取れません。この時はシステムのAPIが使えますが、このAPIはUID Viewに戻り、UID Viewに戻ります。

/**
   
  UIView      (_UIReplicantView)
 
 @return             
 */
- (UIView *)snapshotView
{
 UIView *snapView = [self snapshotViewAfterScreenUpdates:YES];
 return snapView;
}
問題を残す:
方式3で切り取ったUIViewはUImageに変換できません。戻ってきたスクリーンショットViewをビットマップに書き込んでUImageに変換してみましたが、UImageは空か、それともコンテンツがないかを試しました。解決策を知っている人がいたら、教えてください。
UICWebViewのスクリーンショット
去年ブルートゥース印刷をした時、UICWebViewの内容をUImageに変換してみました。UICWebViewのcategoryを書いたことがあります。UID WebViewのスクリーンショットにもなります。ついでに貼ってください。

- (UIImage *)imageForWebView
{
 // 1.  WebView   
 CGSize boundsSize = self.bounds.size;
 CGFloat boundsWidth = boundsSize.width;
 CGFloat boundsHeight = boundsSize.height;

 // 2.  contentSize
 CGSize contentSize = self.scrollView.contentSize;
 CGFloat contentHeight = contentSize.height;
 // 3.       ,       
 CGPoint offset = self.scrollView.contentOffset;
 // 4.         (0,0);
 [self.scrollView setContentOffset:CGPointMake(0, 0)];

 NSMutableArray *images = [NSMutableArray array];
 while (contentHeight > 0) {
  // 5.  CGContext 5.  CGContext
  UIGraphicsBeginImageContextWithOptions(boundsSize, NO, 0.0);
  CGContextRef ctx = UIGraphicsGetCurrentContext();
  // 6.        
  [self.layer renderInContext:ctx];
  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  // 7.         
  [images addObject:image];

  CGFloat offsetY = self.scrollView.contentOffset.y;
  [self.scrollView setContentOffset:CGPointMake(0, offsetY + boundsHeight)];
  contentHeight -= boundsHeight;
 }
 // 8 webView           
 [self.scrollView setContentOffset:offset];
 CGFloat scale = [UIScreen mainScreen].scale;
 CGSize imageSize = CGSizeMake(contentSize.width * scale,
         contentSize.height * scale);
 // 9.            、         
 UIGraphicsBeginImageContext(imageSize);
 [images enumerateObjectsUsingBlock:^(UIImage *image, NSUInteger idx, BOOL *stop) {
  [image drawInRect:CGRectMake(0,scale * boundsHeight * idx,scale * boundsWidth,scale * boundsHeight)];
 }];
 UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
 
 return fullImage;
}
締め括りをつける
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。