Добавить тень к UIImage, нарисованному по закругленному пути
-
20-09-2019 - |
Вопрос
Я рисую округленное изображение в ячейке 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.Возможно, вы могли бы попробовать изменить приведенный там код и посмотреть, решит ли это вашу проблему.