2013-11-28 1 views
1

На самом деле мы работаем над приложением краски,Как нарисовать UIBezierPath с изображением, чтобы стереть изображение

Мы делали мазки, используя Безье путь, тракты массива .. мы почти заполнить заявку,

Но являются некоторые проблемы с производительностью для штрихов рисования краски от PathsArray, которые имеют нарисованные безырпаты, как лакированные штрихи, так как малые штрихи замедляются после рисования некоторого количества штрихов,

Так, чтобы избежать этой проблемы с производительностью, мы использовали темный образ iamge за sketchImage View,

Мы обращаемся недавними один ход на Top Эскиз зрения изображения и обновленные нижний Temperary iamge вида с PathsArray,

это работает отлично и imrove производительности, но есть проблема в Eraser ..

Хотя делать резинку в Backgroun temperary iamge просматривать обновления только в конце хода,

Таким образом, мы планировали удалить изображение, когда ластик выбирает, как это сделать .. любые другие способы

-(void)updateTempararyBottomLayerImageView 
{ 
    TempararyBottomLayerImageView.frame = CGRectMake(TopLayerImageView.frame.origin.x, TopLayerImageView.frame.origin.y, TopLayerImageView.frame.size.width, TopLayerImageView.frame.size.height); 

    UIGraphicsBeginImageContext(TempararyBottomLayerImageView.bounds.size); 

    for (NSDictionary *dict in pathsArray) 
    { 
     UIBezierPath *p = (UIBezierPath*)[dict objectForKey:@"path"]; 
     p.lineWidth = [[dict objectForKey:@"size"]floatValue]; 

     if ([[dict objectForKey:@"red"] floatValue] == 0) //When eraser selected 
     { 
      CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear); 
     } 
     else 
     { 
      CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy); 
      [[UIColor colorWithRed:[[dict objectForKey:@"red"]floatValue] 
          green:[[dict objectForKey:@"green"]floatValue] 
           blue:[[dict objectForKey:@"blue"]floatValue] 
          alpha:[[dict objectForKey:@"alpha"]floatValue]] setStroke]; 
     } 
     [p stroke]; 
    } 

    [[UIColor colorWithRed:red green:green blue:blue alpha:opacity] setStroke]; 

    if(isEraser) //When eraser selected, change color as clear 
    { 
     CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear); 
    } 
    else 
    { 
     CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy); 
    } 

    if (!isTouchEnd) 
     [bzierPath stroke]; 

    TempararyBottomLayerImageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

} 


- (void) updateDrawingBoard 
{ 

    UIGraphicsBeginImageContext(TopLayerImageView.bounds.size); 

    if (pathsArray.count > 0) 
    { 
     NSDictionary * dict = [pathsArray lastObject]; 

     UIBezierPath *p ; 
     @try { 
      p = (UIBezierPath*)[dict objectForKey:@"path"]; 
     } 
     @catch (NSException *exception) 
     { 
      NSLog(@"xxxxxxxxxxxx"); 
      return; 
     } 


     p.lineWidth = [[dict objectForKey:@"size"]floatValue]; 

     if ([[dict objectForKey:@"red"] floatValue] == 0) //When eraser selected 
     { 
      CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear); 
     } 
     else 
     { 
      CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy); 
      [[UIColor colorWithRed:[[dict objectForKey:@"red"]floatValue] 
          green:[[dict objectForKey:@"green"]floatValue] 
           blue:[[dict objectForKey:@"blue"]floatValue] 
          alpha:[[dict objectForKey:@"alpha"]floatValue]] setStroke]; 
     } 
     [p stroke]; 



     [[UIColor colorWithRed:red green:green blue:blue alpha:opacity] setStroke]; 

     if(isEraser) //When eraser selected, change color as clear 
     { 
      CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear); 
     } 
     else 
     { 
      CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy); 
     } 

     if (!isTouchEnd) 
      [bzierPath stroke]; 

     self.TopLayerImageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

    } 


} 


# pragma =====UITouch delegates===== 
//============================================== 
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if([[event touchesForView:self.TopLayerImageView] count] == 1) 
    { 
     CGPoint touchPoint = [[touches anyObject] locationInView:self.TopLayerImageView]; 

     bzierPath = [UIBezierPath bezierPath]; 
     bzierPath.lineCapStyle = kCGLineCapRound; 
     bzierPath.lineJoinStyle = kCGLineJoinRound; 
     bzierPath.lineWidth = brushSize; 
     [bzierPath moveToPoint:touchPoint]; 
     isTouchEnd = NO; 

     UIBezierPath *tempPath = bzierPath; 
     NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
             tempPath,@"path", 
             [NSNumber numberWithFloat:red], @"red", 
             [NSNumber numberWithFloat:green], @"green", 
             [NSNumber numberWithFloat:blue], @"blue", 
             [NSNumber numberWithFloat:opacity], @"alpha", 
             [NSNumber numberWithFloat:brushSize], @"size", nil]; 
     if (isEraser) 
     { 
      dict = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
        tempPath,@"path", 
        [NSNumber numberWithFloat:0], @"red", 
        [NSNumber numberWithFloat:0], @"green", 
        [NSNumber numberWithFloat:0], @"blue", 
        [NSNumber numberWithFloat:0], @"alpha", 
        [NSNumber numberWithFloat:brushSize], @"size", nil]; 
     } 
     [pathsArray addObject:dict]; 

     [self updateDrawingBoard]; 
    } 

    //To hide bottom scroll wheel where ever tap in view 
    UITouch *touch = [[event allTouches] anyObject]; 
    if ([touch view] != bottomScrollWheel) 
    { 
     [self minimizeScrollWheel]; 
    } 
} 

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if([[event touchesForView:self.TopLayerImageView] count] == 1) 
    { 
     CGPoint touchPoint = [[touches anyObject] locationInView:self.TopLayerImageView]; 


     [bzierPath addLineToPoint:touchPoint]; 
     [bzierPath moveToPoint:touchPoint]; 

     isTouchEnd = NO; 

     [self updateDrawingBoard]; 
    } 
} 

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if([[event touchesForView:self.TopLayerImageView] count] == 1) 
    { 


     // NSLog(@"**********************bzierPath == \r\n %@",bzierPath); 

     CGPoint touchPoint = [[touches anyObject] locationInView:self.TopLayerImageView]; 
     [bzierPath moveToPoint:touchPoint]; 

     [bzierPath addLineToPoint:touchPoint]; 

     //bzierPath = nil; 
     isTouchEnd = YES; 
     [self updateDrawingBoard]; 
     [self updateTempararyBottomLayerImageView]; 

     if (TopLayerImageView.image != nil) 
     { 
      [undoArray addObject:TempararyBottomLayerImageView.image]; 
      [redoArray removeAllObjects]; 
      [redoPathsArray removeAllObjects]; 
     } 


      self.TopLayerImageView.image = nil; 
     [self EnableDisableUndoRedo]; 
    } 
} 


# pragma mark =====Settings ===== 
//============================== 
// Slider Position can be changed from left to right or right to left 
-(void)sliderPositionChange 
{ 
    if (settingsPopoverVC.index == 0) 
    { 
     if (iOS7) 
      [sliderView setFrame:CGRectMake(19, 128, 100, 357)]; 
     else 
      [sliderView setFrame:CGRectMake(19, 108, 100, 357)]; 
    } 
    else if(settingsPopoverVC.index == 1) 
    { 
     if (iOS7) 
      [sliderView setFrame:CGRectMake(900, 128, 100, 357)]; 
     else 
      [sliderView setFrame:CGRectMake(900, 108, 100, 357)]; 

    } 
} 
+0

Пробовали ли вы с [себе] setNeedDisplay – codercat

+0

я ДНТ знать о точности, связанные с [само setNeedDisplay]; Вы можете объяснить подробно. – user2732294

ответ