我需要在用戶的照片周圍繪製陰影。我通過繪製一個圓圈然後裁剪上下文來繪製這些圓圈照片。這裏是我的代碼片段:剪輯後無法繪製陰影
+ (UIImage*)roundImage:(UIImage*)img imageView:(UIImageView*)imageView withShadow:(BOOL)shadow
{
UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, [UIScreen mainScreen].scale);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextAddEllipseInRect(context, CGRectMake(0,0, imageView.width, imageView.height));
CGContextSaveGState(context);
CGContextClip(context);
[img drawInRect:imageView.bounds];
CGContextRestoreGState(context);
if (shadow) {
CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 5, [kAppColor lighterColor].CGColor);
}
CGContextDrawPath(context, kCGPathFill);
UIImage* roundImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return roundImage;
}
但是在裁剪區域後,我無法在下面繪製陰影。所以我不得不在照片後面畫一個陰影。
+ (UIImage *)circleShadowFromRect:(CGRect)rect circleDiameter:(CGFloat)circleDiameter shadowColor:(UIColor*)color
{
UIGraphicsBeginImageContextWithOptions(rect.size, NO, [UIScreen mainScreen].scale);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
CGFloat circleStartPointX = CGRectGetMidX(rect) - circleDiameter * 0.5;
CGFloat circleStartPointY = CGRectGetMidY(rect) - circleDiameter * 0.5;
CGContextAddEllipseInRect(context, CGRectMake(circleStartPointX,circleStartPointY, circleDiameter, circleDiameter));
CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 5, color.CGColor);
CGContextDrawPath(context, kCGPathFill);
UIImage *circle = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return circle;
}
這種方法的問題顯然是它擊中我的應用程序的性能 - 拉兩次圈加它的實現代碼如下。 我的問題是我怎樣才能避免繪製第二個圓,並在裁剪上下文後繪製陰影?我確實保存並恢復了狀態,但沒有幫助,我可能做錯了。我還假定drawInRect關閉當前路徑,這就是爲什麼陰影不知道在哪裏繪製自己。我應該再次調用CGContextAddEllipseInRect然後繪製陰影嗎?
謝謝先生,我一直在等你過去幾天的答案。甚至在Twitter上發佈了這個問題;)我一直在關注你的博客和你在過去一個月的SO上的答案:)。我是Core Graphics的新手,你的專業知識對我很有幫助。再次感謝您提供豐富的答案。現在我知道我出錯了。 – macL0vin
我很高興它有幫助。關鍵是,這種表現可能不直觀,而且依情況而定。 –