РЕДАКТИРОВАТЬ 3 октября. 2013 Обновлено для поддержки нового сверхбыстрого drawViewHierarchyInRect: afterScreenUpdates: метод в iOS 7.
Нет.RenderInContext от CALayer: насколько я знаю, единственный способ сделать это.Вы можете создать категорию UIView следующим образом, чтобы вам было легче двигаться вперед:
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);
/* iOS 7 */
if ([self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
[self drawViewHierarchyInRect:self.bounds afterScreenUpdates:NO];
else /* iOS 6 */
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* ret = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return ret;
}
@end
Таким образом, вы можете сказать [self.view.window imageRepresentation]
в контроллере представления и получить полный скриншот вашего приложения.Это может исключить строку состояния, хотя.
РЕДАКТИРОВАТЬ:
И я могу добавить.Если у вас есть UIView с прозрачным содержимым, и вам также необходимо представление изображения С подложным содержимым, вы можете получить представление изображения представления контейнера и обрезать это изображение, просто взяв прямоугольник подпредставления и преобразовав его в контейнерсистема координат представления.
[view convertRect:self.bounds toView:containerView]
Чтобы обрезать, см. ответ на этот вопрос: Обрезка UIImage