Iphone 将阴影添加到图层会导致视网膜外观退化

Iphone 将阴影添加到图层会导致视网膜外观退化,iphone,cocoa-touch,ios,calayer,Iphone,Cocoa Touch,Ios,Calayer,我对CALayer阴影有问题。以下是我的观点: UIImage *screenshot = [SomeClass getScreenshot:mainView.view]; //full screen snap CGFloat scale = [SomeClass getScreenScale]; // 1 or 2 for retina CGFloat width = mainView.view.frame.size.width; CGRect r1 = CGRectMake(0, 0, wi

我对CALayer阴影有问题。以下是我的观点:

UIImage *screenshot = [SomeClass getScreenshot:mainView.view]; //full screen snap
CGFloat scale = [SomeClass getScreenScale]; // 1 or 2 for retina
CGFloat width = mainView.view.frame.size.width;
CGRect r1 = CGRectMake(0, 0, width*scale, 300*scale);     
CGRect u1 = CGRectMake(0, 0, width, 300);
CGImageRef ref1 = CGImageCreateWithImageInRect([screenshot CGImage], r1);
l1 = [[UIButton alloc] initWithFrame:u1];
UIImage *img1 = [UIImage imageWithCGImage:ref1];
[l1 setBackgroundImage:img1 forState:UIControlStateNormal];
[l1 setAdjustsImageWhenHighlighted:NO];
CGImageRelease(ref1);
[mainView.view addSubview:l1];
好吧,这样就行了。添加的图像是视网膜分辨率。但是,只要我在图层上添加阴影,它就会跳到标准分辨率,使按钮看起来模糊

l1.layer.shadowOffset = CGSizeMake(0, 0);
l1.layer.shadowRadius = 20;
l1.layer.shadowColor = [UIColor blackColor].CGColor;
l1.layer.shadowOpacity = 0.8f;
l1.layer.shouldRasterize = YES;

是否有任何原因说明添加阴影会导致此问题

我真的不知道为什么会这样,但我认为这是由UIImage创建引起的。您创建了一个大的(视网膜大小600*600像素)CGImageRef,并从中创建UIImage。但是UIImage没有意识到,它是一个视网膜图像(它现在有600*600个点,它应该有300*300个点,比例因子为2,这将再次导致600*600像素)

请尝试使用
imageWithCGImage:scale:orientation:
创建您的
UIImage
。这将使UIImage了解视网膜比例,层操作可能正常

所以你的路线是:

UIImage *img1 = [UIImage imageWithCGImage:ref1 
    scale: scale 
    orientation: UIImageOrientationUp];

Edit(请参阅我下面的评论):问题是由
l1.layer.shouldRasterize=YES
引起的。您还需要指定
l1.layer.rasterizationScale=scale
,图像将按预期进行渲染。

谢谢您的建议,但它似乎不起作用。仍然恢复到标准分辨率:/我自己试过了。渲染不良的原因是l1.layer.shouldRasterize=YES;您还需要设置l1.layer.rasterizationScale=scale。这就是问题所在。谢谢你的帮助!