我正在制作一个绘图项目,我想支持多点触控,我已经通过在线文档,建议跟踪触摸点,我做到了,但我没有得到理想的行为。我没有直线。
以下是我的代码
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
red = 0.0/255.0;
green = 0.0/255.0;
blue = 0.0/255.0;
brush = 10.0;
opacity = 1.0;
self.view.multipleTouchEnabled = YES;
touchPaths = [NSMutableDictionary dictionary];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
for (UITouch *touch in touches)
{
NSString *key = [NSString stringWithFormat:@"%d", (int) touch];
lastPoint = [touch locationInView:self.view];
[touchPaths setObject:[NSValue valueWithCGPoint:lastPoint] forKey:key];
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch *touch in touches)
{
NSString *key = [NSString stringWithFormat:@"%d", (int) touch];
lastPoint = [[touchPaths objectForKey:key] CGPointValue];
CGPoint currentPoint1 = [touch locationInView:self.view];
UIGraphicsBeginImageContext(self.view.frame.size);
[self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint1.x, currentPoint1.y);
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush );
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0);
CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal);
CGContextStrokePath(UIGraphicsGetCurrentContext());
self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
[self.tempDrawImage setAlpha:opacity];
UIGraphicsEndImageContext();
lastPoint = currentPoint1;
}
}
但是当我使用这段代码绘制时,我得到了这个。
所以朋友们,请帮帮我,我做错了什么。
此致 兰吉特
答案 0 :(得分:4)
您没有正确填充touchPaths
。尝试在每次绘图后设置它,如下所示:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch *touch in touches)
{
NSString *key = [NSString stringWithFormat:@"%d", (int) touch];
CGPoint lastPoint = [[touchPaths objectForKey:key] CGPointValue];
CGPoint currentPoint1 = [touch locationInView:self.view];
UIGraphicsBeginImageContext(self.view.frame.size);
[self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint1.x, currentPoint1.y);
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush );
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0);
CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal);
CGContextStrokePath(UIGraphicsGetCurrentContext());
self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
[self.tempDrawImage setAlpha:opacity];
UIGraphicsEndImageContext();
// I changed your code here
[touchPaths setObject:[NSValue valueWithCGPoint:currentPoint1] forKey:key];
}
}
您目前正在此处设置lastPoint
但您似乎没有使用它(并且它只能一键操作)。也无需将lastPoint
作为字段。
答案 1 :(得分:3)
我总是尽可能使用手势识别器。在这里,我使用UIPanGestureRecognizer
:
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view addGestureRecognizer:[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(didPan:)]];
}
- (void)didPan:(UIPanGestureRecognizer*)panGesture {
for (NSUInteger touchIndex = 0; touchIndex < panGesture.numberOfTouches; touchIndex++) {
// touchIndex is basically the "source" (the finger) from which the point comes from
CGPoint p = [panGesture locationOfTouch:touchIndex inView:self.view];
[self drawAtPoint:p withIndex:touchIndex];
}
}
- (void)drawAtPoint:(CGPoint)point withIndex:(NSUInteger)index{
UIView *smallPoint = [[UIView alloc] initWithFrame:CGRectMake(point.x, point.y, 3, 3)];
[smallPoint setBackgroundColor:[self colorForIndex:index]];
[self.view addSubview:smallPoint];
}
- (UIColor*)colorForIndex:(NSUInteger)index {
switch (index) {
case 0: return [UIColor redColor];
case 1: return [UIColor orangeColor];
case 2: return [UIColor yellowColor];
case 3: return [UIColor blueColor];
case 4: return [UIColor greenColor];
}
return [UIColor clearColor];
}
我没有绘制bezier路径,但是如果你将它放在一个空的ViewController中并运行它,你会看到当多次触摸屏幕时,每个手指都会绘制不同的颜色。
因此,如果你考虑touchIndex,基本上你可以跟踪不同手指的不同路径。
假设您使用两根手指绘制:您将拥有panGesture.numberOfTouches == 2
,而touchIndex 0
将代表第一根手指,touchIndex 1
将代表第二根手指。您可以累积不同数组中的点,并将这些点添加到相应的路径中。