Добавьте тень к UIImage, нарисованному по закругленному пути - PullRequest
0 голосов
/ 15 марта 2010

Я рисую округленное изображение в ячейке 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);

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

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

Ответы [ 2 ]

3 голосов
/ 23 марта 2010

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

CGContextSetShadow(...);
[self.theClippedImage drawInRect:...];
1 голос
/ 20 марта 2010

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

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

...