1

I have a circle with a black outline, and a white fill that I need to programmatically make the white into another color (via a UIColor). I've tried a handful of other stackoverflow solutions but none of them seem to work correctly, either filling just the outside or an outline.

I have two ways I could do this but I am unsure of how I would get the right results:

Tint just the white color to whatever the UIColor should be,

or,

Make a UIImage from two circles, one being filled and one overlapping that with black.

4

3 回答 3

5

如果您决定使用两个圆圈,一个白色和一个黑色,那么您可能会发现这很有帮助。此方法将为您着色一个 uiimage,但它解决了仅着色不透明部分的问题,这意味着如果您提供一个在圆圈周围具有透明度的 png,它只会对圆圈着色。因此,它不会填充图像的整个 24x24 帧,而是只填充不透明的部分。这不完全是您的问题,但如果您使用列出的第二个选项,您可能会遇到这个问题。

-(UIImage*)colorAnImage:(UIColor*)color :(UIImage*)image{

CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContextWithOptions(rect.size, NO, image.scale);
CGContextRef c = UIGraphicsGetCurrentContext();
[image drawInRect:rect];
CGContextSetFillColorWithColor(c, [color CGColor]);
CGContextSetBlendMode(c, kCGBlendModeSourceAtop);
CGContextFillRect(c, rect);
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return result;

}

于 2012-09-11T19:45:50.557 回答
0

对于这样简单的形状,只需使用 CoreGraphics 绘制一个正方形和一个圆形——在您的实现中添加设置填充颜色的功能。

如果它只是黑色和白色 - 当您知道颜色表示时,将白色更改为另一种颜色并不是那么困难。不幸的是,这编写和执行起来更复杂,所以……我的建议是直接去 CoreGraphics 完成你概述的简单任务(糟糕的双关语,抱歉)。

这是一个快速演示:

static void InsetRect(CGRect* const pRect, const CGFloat pAmount) {
    const CGFloat halfAmount = pAmount * 0.5f;
    *pRect = CGRectMake(pRect->origin.x + halfAmount, pRect->origin.y + halfAmount, pRect->size.width - pAmount, pRect->size.height - pAmount);
}

static void DrawBorderedCircleWithWidthInContext(const CGRect pRect, const CGFloat pWidth, CGContextRef pContext) {
    CGContextSetLineWidth(pContext, pWidth);
    CGContextSetShouldAntialias(pContext, true);
    CGRect r = pRect;
    /* draw circle's border */
    CGContextSetRGBStrokeColor(pContext, 0.8f, 0.7f, 0, 1);
    InsetRect(&r, pWidth);
    CGContextStrokeEllipseInRect(pContext, r);
    /* draw circle's fill */
    CGContextSetRGBFillColor(pContext, 0, 0, 0.3f, 1);
    InsetRect(&r, pWidth);
    CGContextFillEllipseInRect(pContext, r);
}
于 2012-09-11T19:02:40.873 回答
0

扩展一个 UIView 并只实现 drawRect 方法。例如,这将绘制一个带有黑色轮廓的绿色圆圈。

     - (void)drawRect:(CGRect)rect {

          [super drawRect:rect];

          CGContextRef gc = UIGraphicsGetCurrentContext();

          [[UIColor greenColor] setFill];
          CGContextFillEllipseInRect(gc, CGRectMake(0,0,24,24));

          [[UIColor blackColor] set];
          CGContextStrokeEllipseInRect(gc, CGRectMake(0,0,24,24));
    }
于 2012-09-11T19:14:27.390 回答