UIGraphicsBeginImageContextWithOptions не захватывает тени / градиенты

ПРОБЛЕМА

Я использую UIGraphicsBeginImageContextWithOptions, чтобы сохранить скриншот в UIImage. Хотя это работает, в результате UIImage отсутствуют тени и градиенты.

Как я могу получить скриншот слоя?


ИСПЫТАТЕЛЬНЫЙ КОД, ВЫЯВЛЯЩИЙ ПРОБЛЕМУ


#import "ViewController.h" #import <QuartzCore/QuartzCore.h> @implementation ViewController - (void)viewDidLoad { //super [super viewDidLoad]; //background self.view.backgroundColor = [UIColor whiteColor]; //container UIView *container = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 300, 200)]; container.backgroundColor = [UIColor blackColor]; [self.view addSubview:container]; //circle UIView *circle = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 10, 10)]; circle.backgroundColor = [UIColor whiteColor]; circle.layer.cornerRadius = 5; circle.layer.shadowColor = [UIColor redColor].CGColor; circle.layer.shadowOffset = CGSizeZero; circle.layer.shadowOpacity = 1; circle.layer.shadowRadius = 10; circle.layer.shadowPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(-10, -10, 30, 30)].CGPath; [container addSubview:circle]; //screenshot UIGraphicsBeginImageContextWithOptions(container.bounds.size, container.opaque, 0.0); [container.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //image view UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(10, 568-200-20-10, 300, 200)]; iv.image = screenshot; [self.view addSubview:iv]; } @end 

СИМУЛЯТОРНЫЙ СКРИНШОТ ПОКАЗЫВАЕТ ПРОБЛЕМУ


Верхняя область – это исходный вид. Нижняя область – это UIImageView со снимком экрана.

Скриншот Simulator

В этой строке,

UIGraphicsBeginImageContextWithOptions (container.bounds.size, container.opaque, 0.0);

 put NO instead of container.opaque 

Используйте этот метод,

 - (UIImage *)imageOfView:(UIView *)view { if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0); } else { UIGraphicsBeginImageContext(view.bounds.size); } [view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return img; }