Добавить тень к UIImage, нарисованному по закругленному пути

StackOverflow https://stackoverflow.com/questions/2444042

Вопрос

Я рисую округленное изображение в ячейке UITableView следующим образом:

CGRect imageRect = CGRectMake(8, 8, 40, 40);
CGFloat radius = 3;

CGFloat minx = CGRectGetMinX(imageRect);
CGFloat midx = CGRectGetMidX(imageRect);
CGFloat maxx = CGRectGetMaxX(imageRect);
CGFloat miny = CGRectGetMinY(imageRect);
CGFloat midy = CGRectGetMidY(imageRect);
CGFloat maxy = CGRectGetMaxY(imageRect);

CGContextMoveToPoint(context, minx, midy);
CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
CGContextClosePath(context);

CGContextClip(context);

[self.theImage drawInRect:imageRect];

Выглядит великолепно, но я бы хотел добавить к нему тень для дополнительного эффекта.Я пробовал использовать что-то вроде:

CGContextSetShadowWithColor(context, CGSizeMake(2, 2), 2, [[UIColor grayColor] CGColor]);
CGContextFillPath(context);

Но это работает только тогда, когда изображение имеет прозрачные области. Если изображение вообще не прозрачно, оно даже не будет рисовать тень вокруг границы.

Мне интересно, есть ли что-то, что я делаю неправильно?

Это было полезно?

Решение

Оказывается, правильный способ сделать это — обрезать сам UIImage, а не путь.Тогда это простой вопрос:

CGContextSetShadow(...);
[self.theClippedImage drawInRect:...];

Другие советы

Я предполагаю, что если изображение, которое вы рисуете, не имеет прозрачных областей, CoreGraphics интерпретирует все изображение как сплошной объект.Тогда, если он попытается нарисовать тень, тень будет нарисована за пределами изображения, и поэтому вы ее не увидите.

Эта страница предоставляет хороший пример того, как сделать такое рисование с помощью CoreGraphics.Возможно, вы могли бы попробовать изменить приведенный там код и посмотреть, решит ли это вашу проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top