我试图通过抚摸图像来绘制线条以通过CoreGraphics
框架获得类似画笔的效果。
我关注this post和this post并尝试从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();
但是当我跑步并试图在触摸移动时绘制时,没有任何东西被绘制出来。我不知道出了什么问题。有人能指出我的错误吗?我仍然花了很多时间来解决这个问题,但现在还没有做到。非常感谢任何及时的帮助。 感谢。
答案 0 :(得分: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;
}