質問

グラデーションの背景を持つ独自のuitableviewcellsを作成しています。私はすべてのロジックと描画がうまくいきましたが、私が修正したいことの1つは、カスタムセルの角の周りの「塊」です。

Alt Text http://grab.by/27sm

コーナーをズームインすると、私が話していることを見ることができます。これが私がセルを生成するために使用しているコードです。

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ポイントに設定します)、その半分が切り取られるためです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top