2012-02-08 2 views
0

Я создаю приложение, и в одной части я пытаюсь реализовать ручную запись. Я использовал imageView для записи, который будет сохранен и отправлен на сервер в виде pdf. Я применил touch begin, move and end и используя contextAddLineToPoint, я могу создавать строки, когда пользователь записывает материал. Однако. Написание немного важно, и я пытаюсь создать кривые, когда пользователь меняет направление записи, то есть когда написано письмо. Я действительно не хочу реализовывать распознавание рукописного ввода, но просто для сглаживания линии.Как создать кривую для строк при рукописном

Я создал «буфер», состоящий из массива, который удерживает две промежуточные точки, когда пользователь перемещает касание. следующим образом:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

UITouch *touch = [touches anyObject]; 

lastPoint = [touch locationInView:drawImage]; 
NSLog(@"first touch:%@",[NSValue valueWithCGPoint:lastPoint]); 

} 

drawImage - это изображениеView, которое я использую для записи на btw. Затем идет на ощупь поколеблется:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
UITouch *touch = [touches anyObject]; 
currentPoint = [touch locationInView:drawImage]; 

if (movementCount<2) { 
    [pointHolderArray addObject:[NSValue valueWithCGPoint:currentPoint]]; 
    movementCount ++; 
    NSLog(@"pointHolderArray: %@",pointHolderArray); 
}else 
{  
    NSLog(@"buffer full"); 
    UIGraphicsBeginImageContext(drawImage.frame.size); 
    [drawImage.image drawInRect:drawImage.frame]; 
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetAllowsAntialiasing(UIGraphicsGetCurrentContext(), YES); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 3.0); 
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.3, 0.5, 0.2, 1.0); 
    CGContextBeginPath(UIGraphicsGetCurrentContext()); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(),[[pointHolderArray objectAtIndex:0]CGPointValue].x,[[pointHolderArray objectAtIndex:0]CGPointValue].y); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), [[pointHolderArray objectAtIndex:0]CGPointValue].x,[[pointHolderArray objectAtIndex:0]CGPointValue].y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), [[pointHolderArray objectAtIndex:1]CGPointValue].x,[[pointHolderArray objectAtIndex:1]CGPointValue].y); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), [[pointHolderArray objectAtIndex:1]CGPointValue].x,[[pointHolderArray objectAtIndex:1]CGPointValue].y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    lastPoint = [touch previousLocationInView:drawImage]; 
    [pointHolderArray removeAllObjects]; 
    movementCount=0; 
} 

}

Как вы можете видеть, каждый раз, когда две точки были сохранены, я затем провести линию между ними. Это сделало рисунок немного сложнее, и линия еще более оборвана.

Может кто-нибудь помочь с проблемой, я очень новичок в области графики в iOS, и не уверен, что я даже использую правильный API, и если я даже должен использовать imageView.

Большое спасибо заранее

ответ

1

Как об использовании Pan Gesture распознавателя и GLPaint. Вы можете установить что-то вроде этого в viewDidLoad:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIPanGestureRecognizer *g = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(viewPanned:)]; 

.. 

Затем захватить движение панорамирования:

-(void) viewPanned:(UIPanGestureRecognizer *)g 
{ 

    CGPoint point = [g locationInView:paintView]; 
    // invert y for OpenGL 
    point.y = paintView.bounds.size.height - point.y ; 

    switch (g.state) { 
     case UIGestureRecognizerStateBegan: 
      prevPoint = point ; 
      break ; 
     case UIGestureRecognizerStateChanged: 
      [paintView renderLineFromPoint:prevPoint toPoint:point] ; 
      prevPoint = point ; 
      break ; 
     case UIGestureRecognizerStateEnded: 
      prevPoint = point ; 
      break ; 
    } 
} 

В «paintView», показанный здесь, является экземпляром PaintView, который вы можете найти в примере GLPaint в образце компании Apple код. В примере не показано, как изменить размер пера, но вы можете сделать это, установив различные glPointSize.

- (void)setBrushSize:(CGFloat)size 
{ 
    if(size <= 1.0) { 
     glPointSize(10); 
    } 
    else if (size <= 2.0) { 
     glPointSize(20); 
    } 
    else if (size <= 3.0) { 
     glPointSize(30); 
    }  
    else if (size <= 4.0) { 
     glPointSize(40); 
    }  
    .. 

Надеется, что это помогает ..

+0

Dude Большого спасибо за подсказку об использовании pangesture recognisers !! Я бы никогда не подумал о смешении этих двух вместе! Еще не пробовал, но уверен, похоже, что это сработает :) – Septronic

+0

Да, я попробовал, и кривая вышла, как кривая арбуза !! :) Спасибо – Septronic

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