我正在使用以下方法捕获应用程序顶级视图的图像。但是,它的速度非常慢,所以我正在寻找更快的替代方案。有什么建议?日志语句只是为了捕获时间。
+ (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个左右。那么可能导致它需要这么长时间?它是否在我的所有子视图上触发了一些方法?是否有一种有效的替代方法来捕获我可以使用的全屏?
答案 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:
进一步减少时间,但就目前而言,这完全符合我的需求。