1

フレームワークを介してブラシのような効果を得るために画像をストロークして線を引こうとしていCoreGraphicsます。

この投稿この投稿をフォローして、メソッドから描画しようとしましたがtouchesMoved、コードサンプルは次の形式になります

UITouch *touch  = [touches anyObject];
CGPoint currentPoint    = [touch locationInView:self.view];
UIImage *texture = [UIImage imageNamed:@"texture.png"];
CGPoint vector = CGPointMake(currentPoint.x - lastPoint.x, currentPoint.y - lastPoint.y);
NSLog(@" vector %@", NSStringFromCGPoint(vector));
CGFloat distance = hypotf(vector.x, vector.y);
vector.x /= distance;
vector.y /= distance;
for (CGFloat i = 0; i < distance; i += 1.0f) {
    CGPoint p = CGPointMake(lastPoint.x + i * vector.x, lastPoint.y + i * vector.y);
    [texture drawAtPoint:p blendMode:kCGBlendModeNormal alpha:1.0f];
    NSLog(@"p %@", NSStringFromCGPoint(p));
}
previousPoint = currentPoint;

そうすることで、エラーメッセージが表示されました。

Jul  9 11:51:27 mac1.local Smooth Line View[1035] <Error>: CGContextSaveGState: invalid context 0x0
Jul  9 11:51:27 mac1.local Smooth Line View[1035] <Error>: CGContextSetBlendMode: invalid context 0x0
Jul  9 11:51:27 mac1.local Smooth Line View[1035] <Error>: CGContextSetAlpha: invalid context 0x0
Jul  9 11:51:27 mac1.local Smooth Line View[1035] <Error>: CGContextTranslateCTM: invalid context 0x0
Jul  9 11:51:27 mac1.local Smooth Line View[1035] <Error>: CGContextScaleCTM: invalid context 0x0
Jul  9 11:51:27 mac1.local Smooth Line View[1035] <Error>: CGContextDrawImage: invalid context 0x0
Jul  9 11:51:27 mac1.local Smooth Line View[1035] <Error>: CGContextRestoreGState: invalid context 0x0

それで、コンテキストに関連するコードを配置し、変更されたコードは

    UITouch *touch  = [touches anyObject];
    currentPoint    = [touch locationInView:self];

    UIGraphicsBeginImageContext(self.frame.size);    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(context, kCGBlendModeNormal);
    CGContextSetAlpha(context, 1.0f);
    CGContextSaveGState(context);

    UIImage *texture = [UIImage imageNamed:@"textureImg.png"];
    [texture drawAtPoint:currentPoint blendMode:kCGBlendModeNormal alpha:1.0f];
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(context, 25.0);
    CGContextSetRGBStrokeColor(context, texture.CGColor);
    CGContextBeginPath(context);
    CGContextMoveToPoint(context, previousPoint.x, previousPoint.y);
    CGContextAddLineToPoint(context, currentPoint.x, currentPoint.y);
    CGContextDrawPath(context, kCGPathFillStroke);
    UIGraphicsEndImageContext();

しかし、走ってタッチムーブで描画しようとすると、何も描画されません。何が悪かったのかわかりません。誰かが私の間違いを指摘できますか?私はまだこれを整理するのに多くの時間を費やしていますが、今はまだできません。タイムリーなヘルプをいただければ幸いです。ありがとう。

4

1 に答える 1

1

なるほど、touchesMoved は次のようになります。

BOOL touchSwiped = YES;
UITouch *touch = [touches anyObject];   
currentPoint = [touch locationInView:self.view];
currentPoint.y -= 685;     //<
//currentPoint.x = ???;  <------ adjust the x and y points of the currentPoint if it is not on the exact point of drawing.

UIGraphicsBeginImageContext(touchDraw.frame.size);
[touchDraw.image drawInRect:CGRectMake(0, 0, touchDraw.frame.size.width, touchDraw.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
UIImage * textureColor = [UIImage imageNamed:@"brushImg.png"];

CGPoint vector = CGPointMake(currentPoint.x - previousPoint.x, currentPoint.y - previousPoint.y);
CGFloat distance = hypotf(vector.x, vector.y);
vector.x /= distance;
vector.y /= distance;
for (CGFloat i = 0; i < distance; i += 1.0f) {
    CGPoint p = CGPointMake(previousPoint.x + i * vector.x, previousPoint.y + i * vector.y);
    [textureColor drawAtPoint:p blendMode:blendMode alpha:0.5f];
}
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextStrokePath(UIGraphicsGetCurrentContext());
touchDraw.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

previousPoint = currentPoint;

touchMoved++;

if (touchMoved == 1) {
    touchMoved = 0;
}
于 2012-07-11T03:15:53.637 に答える