2013-12-24 3 views
6

Я работаю над проектом рисования, я хочу поддерживать мультитач, я прошел онлайн-документацию, предлагающую отслеживать точки касания, я сделал это, но я не получаю желаемого поведения. Я не получаю прямых линий.Трек точки касания в Multitouch

Ниже мой код

- (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; 

    } 
} 

Но когда я рисую с помощью этого кода, я получаю это. enter image description here

Так что друзья, пожалуйста, помогите мне, что я делаю неправильно.

С уважением Ранджит

ответ

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.

+0

спасибо, он работает, я делаю это, потому что я хотел писать каждый раз, когда я положил руку на экран ipad и правильно. Можете направить меня, как я отклоняю это касание руки и только рисую пальцем/стилусом, и все, что нарисовано с помощью запястья, должно быть отменено/отклонено. – Ranjit

+0

Кроме того, это был всего лишь пример с двумя точками, то есть с последней точкой и текущей точкой. Теперь в моем проект, чтобы нарисовать гладкие линии и кривые, у меня есть две последние точки и одна текущая точка в штрихах, так что я должен хранить их все в отдельных словарях? – Ranjit

+0

См. Эту страницу для подсказок о том, как рисовать более гладкие пути: http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_freehand-drawing/ – Krumelur

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]; 
} 

Я не рисую путь Безье, но если вы поместите его в пустой ViewController и запустить его, вы увидите, что при нескольких прикосновений к экрану, каждый палец рисует другой цвет.

Так что если вы принимаете во внимание touchIndex, в основном вы можете отслеживать разные пути для разных пальцев.

Предположим, вы используете два пальца для рисования: у вас будет panGesture.numberOfTouches == 2, а touchIndex 0 будет представлять первый палец, а touchIndex 1 будет представлять второй палец. Вы можете накапливать точки в разных массивах и добавлять точки к соответствующему пути.

+1

хороший, это умный ... (за исключением выделения нового uiview для ленивого рисунка: D) очень умный – Jef

Смежные вопросы