黒い輪郭の円と、(UIColor を介して) プログラムで白を別の色にする必要がある白の塗りつぶしがあります。他のいくつかのスタックオーバーフローソリューションを試しましたが、どれも正しく機能していないようで、外側またはアウトラインだけを埋めています。
これを行うには2つの方法がありますが、正しい結果を得る方法がわかりません:
UIColor がどうあるべきか、白色だけに色を付けます。
また、
2 つの円から UIImage を作成します。1 つは塗りつぶされ、もう 1 つは黒で重なります。
黒い輪郭の円と、(UIColor を介して) プログラムで白を別の色にする必要がある白の塗りつぶしがあります。他のいくつかのスタックオーバーフローソリューションを試しましたが、どれも正しく機能していないようで、外側またはアウトラインだけを埋めています。
これを行うには2つの方法がありますが、正しい結果を得る方法がわかりません:
UIColor がどうあるべきか、白色だけに色を付けます。
また、
2 つの円から UIImage を作成します。1 つは塗りつぶされ、もう 1 つは黒で重なります。
白と黒の 2 つの円を使用する場合は、これが役立つことがあります。このメソッドは uiimage に色を付けますが、不透明な部分のみに色を付けるという問題に対処します。つまり、円の周りに透明な png を指定した場合にのみ円に色を付けます。したがって、画像の 24x24 フレーム全体を塗りつぶす代わりに、不透明な部分のみを塗りつぶします。これはまさにあなたの質問ではありませんが、リストした 2 番目のオプションを使用すると、おそらくこの問題に遭遇するでしょう。
-(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;
}
このような単純な形状の場合は、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);
}
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));
}