2

パズルのピースを動的に作成しようとしていますが、次のよう
満たされていないパズルのピース
になります。この形状を色で塗りつぶして、次のよう にします。
満たされたパズルのピース
これを使用して、画像をマスキングできます。
問題: 4 UIBezierPathを使用してこの形状を作成し、を使用して1パスに変換しappendPathます。
このパスを塗りつぶしたいのですが、使用すると次のようfillになり
悪い塗りつぶされたパズルのピース
ます。同じ形状を塗りつぶす方法について何かアイデアはありますか?

4

3 に答える 3

6

しばらくして、私はこれらの結果を得た理由を見つけました。塗りつぶし用のパスを作成する場合はmoveToPoint、メソッドを使用しないでください。代わりに、を使用して最初のポイントを一度設定してから、、などを使用してすべての線を描画する必要がありmoveToPointます。addLineToPointaddCurveToPoint

closePathパスの描画が完了したら、メッセージの送信を忘れないでください。

これを知る前に、さまざまなUIBezierPathインスタンスを使用してパズルのピースのすべての側面を描画し、すべてのパスに対して、を使用して最初のポイントを設定しmoveToPointました。

于 2012-09-07T10:11:27.680 に答える
1

パズルのピースを定義するパスがある場合、それをCAShapeLayer:に変換すると、操作が簡単になります。

CAShapeLayer *myShapeLayer = [CAShapeLayer layer];
myShapeLayer.path = myBezierCurves.CGPath;
myShapeLayer.fillColor = [[UIColor blackColor] CGColor];

myShapeLayer.strokeColor = [[UIColor redColor] CGColor];
myShapeLayer.lineWidth = 2;
于 2012-09-05T10:35:13.513 に答える
0

これを試してください:すべての結合されたポイントで1つのUIbenzierPathを作成する意図として

以下のメソッドを.mファイルに追加します。

 void MyCGPathApplierFunc (void *info, const CGPathElement *element) {

UIBezierPath *drawingPath = (UIBezierPath *)info;
CGPoint *points = element->points;
CGPathElementType type = element->type;

switch(type) {
    case kCGPathElementMoveToPoint: // contains 1 point
        [drawingPath moveToPoint:[[NSValue valueWithCGPoint:points[0]] CGPointValue]];
        break;

    case kCGPathElementAddLineToPoint: // contains 1 point
        [drawingPath addLineToPoint:[[NSValue valueWithCGPoint:points[0]] CGPointValue]];
        break;
    case kCGPathElementAddQuadCurveToPoint: // contains 1 point
        [drawingPath addQuadCurveToPoint:[[NSValue valueWithCGPoint:points[0]] CGPointValue]];
        break;

   case kCGPathElementAddCurveToPoint: // contains 1 point
        [drawingPath addCurveToPoint:[[NSValue valueWithCGPoint:points[0]] CGPointValue]];
        break;

    case kCGPathElementCloseSubpath: // contains no point
        break;
}
}

UIBezierPath*combinedpathを追加します。.hファイルでは、Uは次のような方法を使用できます。

combinedpath = [[UIBezierPath alloc]init];
CGPathApply(appendedBenzierPath.CGPath, (void *)combinedpath, MyCGPathApplierFunc);
[self setNeedsDisplay];

次に、これらの結合パスに入力します

- (void)drawRect:(CGRect)rect
{
  [[UIColor blackColor] setStroke];
  [combinedpath strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
  [combinedpath fill];
}
于 2012-09-05T10:35:13.400 に答える