1212
1313@implementation UIImage (Snapshot)
1414
15- + (UIImage *)fb_imageForViewOrLayer : (id )viewOrLayer
16- {
17- if ([viewOrLayer isKindOfClass: [UIView class ]]) {
18- return [self fb_imageForView: viewOrLayer];
19- } else if ([viewOrLayer isKindOfClass: [CALayer class ]]) {
20- CALayer *layer = (CALayer *)viewOrLayer;
21- [layer layoutIfNeeded ];
22- return [self fb_imageForLayer: layer];
23- } else {
24- [NSException raise: @" Only UIView and CALayer classes can be snapshotted" format: @" %@ " , viewOrLayer];
25- }
26- return nil ;
27- }
28-
2915+ (UIImage *)fb_imageForLayer : (CALayer *)layer
3016{
3117 CGRect bounds = layer.bounds ;
@@ -35,8 +21,8 @@ + (UIImage *)fb_imageForLayer:(CALayer *)layer
3521 UIGraphicsBeginImageContextWithOptions (bounds.size , NO , 0 );
3622 CGContextRef context = UIGraphicsGetCurrentContext ();
3723 NSAssert1 (context, @" Could not generate context for layer %@ " , layer);
38-
3924 CGContextSaveGState (context);
25+ [layer layoutIfNeeded ];
4026 [layer renderInContext: context];
4127 CGContextRestoreGState (context);
4228
@@ -45,10 +31,32 @@ + (UIImage *)fb_imageForLayer:(CALayer *)layer
4531 return snapshot;
4632}
4733
48- + (UIImage *)fb_imageForView : (UIView *)view
34+ + (UIImage *)fb_imageForViewLayer : (UIView *)view
4935{
5036 [view layoutIfNeeded ];
5137 return [self fb_imageForLayer: view.layer];
5238}
5339
40+ + (UIImage *)fb_imageForView : (UIView *)view
41+ {
42+ CGRect bounds = view.bounds ;
43+ NSAssert1 (CGRectGetWidth(bounds), @"Zero width for view %@", view);
44+ NSAssert1 (CGRectGetHeight(bounds), @"Zero height for view %@", view);
45+
46+ UIWindow *window = view.window ;
47+ if (window == nil ) {
48+ window = [[UIWindow alloc ] initWithFrame: bounds];
49+ [window addSubview: view];
50+ [window makeKeyAndVisible ];
51+ }
52+
53+ UIGraphicsBeginImageContextWithOptions (bounds.size , NO , 0 );
54+ [view layoutIfNeeded ];
55+ [view drawViewHierarchyInRect: view.bounds afterScreenUpdates: YES ];
56+
57+ UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext ();
58+ UIGraphicsEndImageContext ();
59+ return snapshot;
60+ }
61+
5462@end
0 commit comments