適用ストロークを四捨五入rectコア-グラフィック
-
24-09-2019 - |
質問
私は勾配が丸いコーナーとしての使用のためのカスタムUITableViewCellます。私へのご連絡は下記より受け付けてストロークのパスができないので、を見ることのできないか間違っています。
CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
minx = minx + 1;
miny = miny ;
maxx = maxx - 1;
maxy = maxy - 1;
CGContextMoveToPoint(c, minx, miny);
CGContextAddArcToPoint(c, minx, maxy, midx, maxy, kDefaultMargin);
CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, kDefaultMargin);
CGContextAddLineToPoint(c, maxx, miny);
CGContextAddLineToPoint(c, minx, miny);
// Fill and stroke the path
CGContextClip(c);
CGContextStrokePath(c);
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND;
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2);
CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0);
CGGradientRelease(myGradient);
CGColorSpaceRelease(myColorspace);
このコードを回の矩形の右の傾斜がないストロークを行います。場所は私の間違い?
編集:
しsubwの提言、私に変更をコードする:
CGContextRef c = UIGraphicsGetCurrentContext();
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef myGradient = nil;
CGFloat components[8] = TABLE_CELL_BACKGROUND;
CGContextSetFillColorWithColor(c, [[UIColor redColor] CGColor]);
CGContextSetStrokeColorWithColor(c, [[UAColor redColor] CGColor]);
CGContextSetLineWidth(c, 2);
CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;
minx = minx + 1;
miny = miny ;
maxx = maxx - 1;
maxy = maxy - 1;
CGContextMoveToPoint(c, minx, miny);
CGContextAddArcToPoint(c, minx, maxy, midx, maxy, kDefaultMargin);
CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, kDefaultMargin);
CGContextAddLineToPoint(c, maxx, miny);
CGContextAddLineToPoint(c, minx, miny);
// Fill and stroke the path
CGContextSaveGState(c);
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);
CGContextStrokePath(c);
そのrect出しんでみてはいかがでしょうか。
で---。を変更した場合、購入したの CGContextStrokePath(c)
する CGContextStrokeRect(c, rect)
, は、ストロークアップ(イメージして作成してみました赤のための明確化).何とか、strokingのパスません断ストローク:(
解決
の対応を修正コードの、引用のドキュメンテーション
とは異なり、現在のパスは、現在のクリッピングパスの一部であるグラフィックの状態です。そのため、再拡大すると塗装可能な地域の復旧をクリッピングパスの事前の状態、保存のグラフィック状態にする前にクリップと復元のグラフィックスの状態を終了した後、あなた他のクリップ。
決定後、新しいクリッピング経路の機能をリセットのスコンテキストの現在のパスに空きます。
では、現在の描画パス ない のグラフィックの状態です。こうやっている:
- 構築を図面パス
- 保存gstate
- 追加現在の描画スクリッピングパス 明確に現在の描画パス
- 描き勾配
- 復元gstate(前回のクリッピングパスが復旧描画パスは空)
- ストロークなし
このセクションにパスをCGPathオブジェクトとして追加します現在のパスの両方のクリッピング前後のgstate前にstroking.
また、あなたが決めるかどうかまた外部ストローク、ストローク、中心の中症に対する注意が必要です。のための中心にストローク、ストロークがクリップ.のための内部ストローク、ストロークがクリップ.のための外側のストローク、リバースのシステムは、クリップします。まだダブルル線幅の両方の形でき切り出しの半分を中症に対する注意が必要です。
を変更した場合、購入したの
CGContextStrokePath(c)
するCGContextStrokeRect(c, rect)
, は、ストローク表示されます。
この機能を追加しますパスの矩形は、現在の描画の道をstroking.
他のヒント
わからないが、多分あなたはストロークの上にグラデーションをペイントしている?
あなたはどちらかのストロークの上にグラデーションを描画している、および/またはあなたが脳卒中地域クリッピングます。
私はより良い以下のかもしれない作品だと思います:
CGContextSaveGState(c);
CGContextClip(c);
//gradient drawing stuff
CGContextRestoreGState(c);
CGContextStrokePath(c);
もちろん、あなたも正しくストロークの色と幅を設定する必要があります。