4

グラデーションの背景を持つ独自のUITableViewCellsを作成しています。私はすべてのロジックと描画を実行しましたが、修正したいことの1つは、カスタムセルの隅にある「分厚い」ことです。

代替テキスト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);

すべてのセルで一定のエッジの厚さを維持しながら、エッジを滑らかにするにはどうすればよいですか?

4

2 に答える 2

7

線幅は 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 などの計算の前にそれを追加すると、形状のストロークが均一になるはずです。

于 2010-02-02T02:09:18.727 に答える
1

ストロークの一貫性を保つもう 1 つの方法は、AddPath と StrokePath の呼び出しを RestoreGState の呼び出しの上に移動することです。つまり、クリップされた状態でストロークします。

このソリューションで実際に 2 ポイント幅のストロークを作成するには、グラフィックス状態に設定した線幅を単純に 2 倍にします (つまり、4 ポイントに設定します)。これは、半分が切り取られるためです。

于 2010-02-02T02:56:44.827 に答える