什么是在iPad上捕获屏幕的更有效方法?

时间:2013-11-17 17:41:09

标签: ios objective-c ipad screenshot

我正在使用以下方法捕获应用程序顶级视图的图像。但是,它的速度非常慢,所以我正在寻找更快的替代方案。有什么建议?日志语句只是为了捕获时间。

+ (UIImage *) imageWithView:(UIView *)view{
   DLog(@"imageWityhView started");
   UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
   DLog(@"1");
   [view.layer renderInContext:UIGraphicsGetCurrentContext()];
   DLog(@"2");
   UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
   DLog(@"3");
   UIGraphicsEndImageContext();
   DLog(@"Returning an image");
   return img;
}

结果:

2013-11-17 11:30:47.196 ... imageWityhView started
2013-11-17 11:30:47.220 ... 1
2013-11-17 11:30:52.543 ... 2
2013-11-17 11:30:52.544 ... 3
2013-11-17 11:30:52.547 ... Returning an image

不出所料,缓慢的过程是renderInContext:。由于速度慢而无法调度到后台线程。该过程由用户操作触发,并且需要尽快得到结果以向用户提供反馈。对于这样的事情来说,五秒似乎是荒谬的时间。

在我的应用中,捕获的视图可能有超过1300个子视图。但是,对于我的测试,只有大约20个左右。那么可能导致它需要这么长时间?它是否在我的所有子视图上触发了一些方法?是否有一种有效的替代方法来捕获我可以使用的全屏?

1 个答案:

答案 0 :(得分:1)

这是一个更新的方法和结果时间。

+ (UIImage *) imageWithView:(UIView *)view{
   UIImage *img;
   DLog(@"1");
   UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0.0);
   if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
      DLog(@"2");
      [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];
      DLog(@"3");
      img = UIGraphicsGetImageFromCurrentImageContext();
   } else {
      [view.layer renderInContext:UIGraphicsGetCurrentContext()];
      img = UIGraphicsGetImageFromCurrentImageContext();
   }
   DLog(@"4");
   UIGraphicsEndImageContext();
   return img;
}

2013-11-17 12:54:03.568 ... 1
2013-11-17 12:54:03.592 ... 2
2013-11-17 12:54:03.740 ... 3
2013-11-17 12:54:03.741 ... 4

总时间从5.3秒减少到< 0.2秒我可以尝试使用snapshotViewAfterScreenUpdates:进一步减少时间,但就目前而言,这完全符合我的需求。