0

Quartz 2dforiPadで簡単なパスを描いて塗りつぶそうとしています。

クラスSPTCutPatternの次のメソッドは、描画するパスを定義します。

- (void) initDummyCutPattern {
NSArray *piece1Path = [[NSArray alloc] initWithObjects:
                       [NSValue valueWithCGPoint:CGPointMake(0, 0)],
                       [NSValue valueWithCGPoint:CGPointMake(3, 0)],
                       [NSValue valueWithCGPoint:CGPointMake(3, 1)],
                       [NSValue valueWithCGPoint:CGPointMake(2, 1)],
                       [NSValue valueWithCGPoint:CGPointMake(2, 2)],
                       [NSValue valueWithCGPoint:CGPointMake(0, 2)],
                       nil];
SPTPuzzlePiece *Piece1 = [[SPTPuzzlePiece alloc] initWithWidthInGrid:3 andHeightInGrid:2 andLeftInGrid:0 andTopInGrid:0 andBuilt:YES andPathInGrid:piece1Path];

NSArray *piece2Path = [[NSArray alloc] initWithObjects:
                       [NSValue valueWithCGPoint:CGPointMake(3, 0)],
                       [NSValue valueWithCGPoint:CGPointMake(5, 0)],
                       [NSValue valueWithCGPoint:CGPointMake(5, 5)],
                       [NSValue valueWithCGPoint:CGPointMake(4, 5)],
                       [NSValue valueWithCGPoint:CGPointMake(4, 4)],
                       [NSValue valueWithCGPoint:CGPointMake(2, 4)],
                       [NSValue valueWithCGPoint:CGPointMake(2, 3)],
                       [NSValue valueWithCGPoint:CGPointMake(3, 3)],
                       [NSValue valueWithCGPoint:CGPointMake(3, 2)],
                       [NSValue valueWithCGPoint:CGPointMake(2, 2)],
                       [NSValue valueWithCGPoint:CGPointMake(2, 1)],
                       [NSValue valueWithCGPoint:CGPointMake(3, 1)],
                       nil];
SPTPuzzlePiece *Piece2 = [[SPTPuzzlePiece alloc] initWithWidthInGrid:3 andHeightInGrid:5 andLeftInGrid:2 andTopInGrid:0 andBuilt:YES andPathInGrid:piece2Path];

NSArray *piece3Path = [[NSArray alloc] initWithObjects:
                       [NSValue valueWithCGPoint:CGPointMake(0, 2)],
                       [NSValue valueWithCGPoint:CGPointMake(3, 2)],
                       [NSValue valueWithCGPoint:CGPointMake(3, 3)],
                       [NSValue valueWithCGPoint:CGPointMake(2, 3)],
                       [NSValue valueWithCGPoint:CGPointMake(2, 4)],
                       [NSValue valueWithCGPoint:CGPointMake(4, 4)],
                       [NSValue valueWithCGPoint:CGPointMake(4, 5)],
                       [NSValue valueWithCGPoint:CGPointMake(0, 5)],
                       nil];

SPTPuzzlePiece *Piece3 = [[SPTPuzzlePiece alloc] initWithWidthInGrid:4 andHeightInGrid:3 andLeftInGrid:0 andTopInGrid:2 andBuilt:YES andPathInGrid:piece3Path];

self.pieces = [[NSArray alloc] initWithObjects:Piece1, Piece2, Piece3, nil];
}

そして、パスを描画することになっているクラスSPTPuzzlePieceViewからのこのメソッド:

- (void)drawRect:(CGRect)rect
{
int widthUnit = self.frame.size.width / self.puzzlePiece.widthInGrid;
int heightUnit = self.frame.size.height / self.puzzlePiece.heightInGrid;
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);

CGContextMoveToPoint(context, [[puzzlePiece.pathInGrid objectAtIndex:0] CGPointValue].x*widthUnit, 
                     [[puzzlePiece.pathInGrid objectAtIndex:0] CGPointValue].y*heightUnit);

for (NSValue *point in puzzlePiece.pathInGrid) {
    CGContextAddLineToPoint(context, [point CGPointValue].x*widthUnit, [point CGPointValue].y*heightUnit);
}

CGContextFillPath(context);
}

私はこれらの3つのオブジェクトを取得していますが、これは私が期待しているものではありません。

スクリーンショット

オブジェクトは次のようになります(または少なくなります)。

欲しかった形

これらの方法が完全に文脈から外されていることをお詫び申し上げますので、私がやろうとしていることをご覧いただければ幸いです。drawRectメソッドが呼び出され、最初のメソッドで定義した各ピースオブジェクトが順番に描画されます。

なぜそれが私が望む形を描いていないのか理解できません。お願い助けて。

ありがとう!

4

1 に答える 1

0

2番目と3番目の形状は、それらのポイントよりも小さい値で初期widthInGrid化されています。heightInGridこれにより、ビューの境界の外側に描画されます。

他の3つのこと:

  1. パスの作成と描画には、呼び出しの代わりにUIBezierPathを使用することを検討してくださいCGContext...。間違えるのは難しいです。ユーザーがこれらの図形に触れてドラッグする必要がある場合は、そのcontainsPoint:方法が非常に便利です。
  2. 変数のObjective-C命名規則では、クラス名と区別するために、変数は小文字で始まります。だから、あなたはSPTPuzzlePiece *piece1の代わりに持っているでしょう*Piece1。変数名内の単語は大文字を使用します。
  3. ではdrawRect、ビュー自体boundsを使用して、のではなく、幅と高さを取得しframeます。ビューを歪めていなければ、これらは同じですが、従うことをお勧めします。bounds描画する座標空間を常に定義します。
于 2012-04-25T19:59:23.210 に答える