コアグラフィックスで丸いストロークを滑らかにする
-
24-09-2019 - |
質問
グラデーションの背景を持つ独自のuitableviewcellsを作成しています。私はすべてのロジックと描画がうまくいきましたが、私が修正したいことの1つは、カスタムセルの角の周りの「塊」です。
コーナーをズームインすると、私が話していることを見ることができます。これが私がセルを生成するために使用しているコードです。
CGContextRef c = UIGraphicsGetCurrentContext();
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef myGradient = nil;
CGFloat components[8] = TABLE_CELL_BACKGROUND;
CGContextSetStrokeColorWithColor(c, [[UAColor colorWithWhite:0.7 alpha:1] CGColor]);
CGContextSetLineWidth(c, 2);
CGContextSetAllowsAntialiasing(c, YES);
CGContextSetShouldAntialias(c, YES);
CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, minx, miny);
CGPathAddArcToPoint(path, NULL, minx, maxy, midx, maxy, kDefaultMargin);
CGPathAddArcToPoint(path, NULL, maxx, maxy, maxx, miny, kDefaultMargin);
CGPathAddLineToPoint(path, NULL, maxx, miny);
CGPathAddLineToPoint(path, NULL, minx, miny);
CGPathCloseSubpath(path);
// Fill and stroke the path
CGContextSaveGState(c);
CGContextAddPath(c, path);
CGContextClip(c);
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND;
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2);
CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0);
CGContextRestoreGState(c);
CGContextAddPath(c, path);
CGContextStrokePath(c);
すべてのセルで一貫したエッジの厚さを維持しながら、エッジを滑らかにするために何ができますか?
解決
ライン幅は2ポイントに設定されています。何が起こっているのかということは、線の幅を理解せずにコードが境界長方を計算していることです。その結果、形状の直線セグメントごとに、ストロークの幅の半分のみが表示されます。アークでは、完全なストローク幅が表示されます。
これが私のアプリであるFunversationのコードの関連するセグメントです。
CGRect rect = [self bounds];
rect.size.width -= lineWidth;
rect.size.height -= lineWidth;
rect.origin.x += lineWidth / 2.0;
rect.origin.y += lineWidth / 2.0;
Minx、Midx、Maxxなどの計算の前に、そしてあなたの形のストロークは均一でなければなりません。
他のヒント
ストロークを一貫させるもう1つの方法は、addpathとstrokepathの呼び出しをrestoregstateコールの上に移動することです。つまり、クリップ中にストロークです。
このソリューションを使用した真に2ポンドのストロークの場合、グラフィック状態に入れたライン幅を2倍にするだけで(つまり、4ポイントに設定します)、その半分が切り取られるためです。
所属していません StackOverflow