2011-06-04 26 views
8

我遇到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; 

是否有任何理由爲什麼添加陰影會導致這個問題?

回答

20

我真的不知道,爲什麼會發生,但我認爲它是由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]; 

編輯(見下面我的意見):這個問題是由l1.layer.shouldRasterize = YES造成的。您還需要指定l1.layer.rasterizationScale = scale,並按預期呈現圖像。

+0

感謝您的建議,但它似乎並不奏效。仍然恢復到標準分辨率。 :/ – 2011-06-05 13:55:31

+12

我自己試了一下。原因是糟糕的渲染是l1.layer.shouldRasterize = YES;您還需要設置l1.layer.rasterizationScale = scale。 – marcus 2011-06-06 05:27:00

+0

這是問題所在。感謝您的幫助! – 2011-06-06 07:35:36