Multiple coloured bezier paths

只谈情不闲聊 提交于 2019-12-12 20:04:30

问题


Here is my code for free hand drawing. But when i draw the path, previous path is disappeared. I am not able to figure it out why is it happening so. Can any body help me. Here is my code.

- (void)drawRect:(CGRect)rect
{

for (NSMutableDictionary *dictionary in pathArray) {

    UIBezierPath *_path = [dict objectForKey:@"Path"];

    UIColor *_colors = [dict objectForKey:@"Colors"];

    [_colors setStroke];

    _path.lineCapStyle = kCGLineCapRound;

    [_path stroke];

  }

}

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

isEdited=YES;

myPath=[[UIBezierPath alloc]init];

myPath.lineWidth=lineWidths;

CGPoint touchPoint = [[touches anyObject] locationInView:self];

UITouch *mytouch=[[touches allObjects] objectAtIndex:0];

[myPath moveToPoint:[mytouch locationInView:self]];

[myPath addLineToPoint:CGPointMake(touchPoint.x+1, touchPoint.y+1)];

[dict setObject:myPath forKey:@"Path"];

[dict setObject:brushPattern forKey:@"Colors"];

[pathArray addObject:dict];

[self setNeedsDisplay];


 }

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

UITouch *mytouch=[[touches allObjects] objectAtIndex:0];

[myPath addLineToPoint:[mytouch locationInView:self]];

[self setNeedsDisplay];

 }

回答1:


You should create myPath and dict localy in touchesBegan: each time it's fired. Ditch their class-wide definitions.

For simpler (faster) performance you can still have class-wide currentPath and currentDict ivars for usage in touchesMoved:

EDIT: code would look something like this:

//currentPath declared as an iVar of UIBezierPath* type
//currentDict declared as an iVar of NSMutableDictionary* type


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{    
    isEdited=YES;

    UIBezierPath *myPath=[[UIBezierPath alloc]init];  //locally created

    myPath.lineWidth=lineWidths;

    CGPoint touchPoint = [[touches anyObject] locationInView:self];

    UITouch *mytouch=[[touches allObjects] objectAtIndex:0];

    [myPath moveToPoint:[mytouch locationInView:self]];

    [myPath addLineToPoint:CGPointMake(touchPoint.x+1, touchPoint.y+1)];

    NSMutableDictionary *dict=[[NSMutableDictionary alloc]init]; //locally created

    [dict setObject:myPath forKey:@"Path"];

    [dict setObject:brushPattern forKey:@"Colors"];

    [pathArray addObject:dict];

    [self setNeedsDisplay];

    currentPath = myPath;
    currentDict = dict;
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
    [currentPath addLineToPoint:[mytouch locationInView:self]];
    [self setNeedsDisplay];
}



回答2:


1) Create a UIImage *currentImage instance variable in your drawing view.

2) in drawRect method of your view put the following line:

[currentImage drawInRect:self.bounds];

3) In touchesEnded method put the following code:

        CGRect rect = self.bounds;
        UIGraphicsBeginImageContext(rect.size);
        [self.layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage *tempImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext(); 
        currentImage = tempImage;


来源:https://stackoverflow.com/questions/10846064/multiple-coloured-bezier-paths

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!