BEARBEITEN 3. Oktober 2013
Aktualisiert, um die neue superschnelle Methode drawViewHierarchyInRect: afterScreenUpdates: in iOS 7 zu unterstützen.
Nein. CALayers renderInContext: ist meines Wissens der einzige Weg, dies zu tun. Sie können eine UIView-Kategorie wie diese erstellen, um sich die Zukunft zu erleichtern:
UIView + Screenshot.h
#import <UIKit/UIKit.h>
@interface UIView (Screenshot)
- (UIImage*)imageRepresentation;
@end
UIView + Screenshot.m
#import <QuartzCore/QuartzCore.h>
#import "UIView+Screenshot.h"
@implementation UIView (Screenshot)
- (UIImage*)imageRepresentation {
UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, self.window.screen.scale);
if ([self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
[self drawViewHierarchyInRect:self.bounds afterScreenUpdates:NO];
else
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* ret = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return ret;
}
@end
Auf diese Weise können Sie möglicherweise [self.view.window imageRepresentation]
in einem Ansichts-Controller sagen , dass Sie einen vollständigen Screenshot Ihrer App erhalten. Dies könnte jedoch die Statusleiste ausschließen.
BEARBEITEN:
Und darf ich hinzufügen. Wenn Sie eine UIView mit transparentem Inhalt haben und auch eine Bilddarstellung mit dem darunter liegenden Inhalt benötigen, können Sie eine Bilddarstellung der Containeransicht abrufen und dieses Bild zuschneiden, indem Sie einfach das Rechteck der Unteransicht nehmen und es in den Container konvertieren Ansichten Koordinatensystem.
[view convertRect:self.bounds toView:containerView]
Zum Zuschneiden siehe Antwort auf diese Frage: Zuschneiden eines UIImage