Question

After drawing lines and circles from bezier path objects i want to now move these objects across the screen. First as i touch on the path object it should get selected which i have done using containsPoint: method.

Now i want that this selected object should get move as i drag my fingure. I am wondering how can i move a stroked bezierpath object to a new location ?

here is my code in touches began:

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    startPoint = [touch locationInView:self];
    //NSLog(@"start point:- %f, %f", startPoint.x, startPoint.y);

    isHitInPath = NO;
    if(!isTextMode)
    {

        for (NSDictionary *testDict in pathArray)
        {
            if([((UIBezierPath *)[testDict objectForKey:@"path"]) containsPoint:startPoint])// if starting touch is on an object of bezierpath
            {
                NSLog(@"touch point is in path: %@ >>>>>>>>>>>>>>", [testDict objectForKey:@"path"]);
                isHitInPath = YES;

                currentSelectedPath = ((UIBezierPath *)[testDict objectForKey:@"path"]);

                CAShapeLayer *centerline = [CAShapeLayer layer];
                centerline.path = currentSelectedPath.CGPath;
                centerline.strokeColor = [UIColor whiteColor].CGColor;
                centerline.fillColor = [UIColor clearColor].CGColor;
                centerline.lineWidth = 1.0;
                centerline.lineDashPattern = [NSArray arrayWithObjects:[NSNumber numberWithInt:6], [NSNumber numberWithInt:6], nil];
                [self.layer addSublayer:centerline];

                // showing animation on line
                CABasicAnimation *dashAnimation;
                dashAnimation = [CABasicAnimation animationWithKeyPath:@"lineDashPhase"];

                [dashAnimation setFromValue:[NSNumber numberWithFloat:0.0f]];
                [dashAnimation setToValue:[NSNumber numberWithFloat:45.0f]];
                [dashAnimation setDuration:1.0f];
                [dashAnimation setRepeatCount:10000];

                [centerline addAnimation:dashAnimation forKey:@"linePhase"];


                break;
            }
        }
}

What should be the correct way of moving (or may be removing old path object and then creating new one of the same size and figure and then move it ) a path object in touches moved.

Was it helpful?

Solution

Sorry for late reply , i solved it. Here is the code from my App:

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

    UITouch *touch = [touches anyObject];
    endPoint = [touch locationInView:self];

    if(isAnyShapeSelected) // shape is selected and getting moved
    {
                [self deselectShape];// deselect the selected shape

                // then create a new bezier path object with a new location (transformed bezierpath object)
                CGPathRef _path = currentSelectedPath.CGPath;// currentSelectedPath is a path which we have selected in touches begin (or while moving)
                CGAffineTransform transform = CGAffineTransformIdentity;
                transform = CGAffineTransformTranslate(transform, endPoint.x-startPoint.x, endPoint.y-startPoint.y);

                _path =  (CGPathCreateMutableCopyByTransformingPath(_path, &transform));

                currentSelectedPath.CGPath = _path;

//                UIBezierPath *uiPath = [UIBezierPath bezierPathWithCGPath:_path];
//                uiPath.lineWidth = currentSelectedPath.lineWidth;

                startPoint = endPoint;

                [self selectShape:currentSelectedPath];// select the shape again

                [dict_path removeAllObjects];//remove all object from current drawing dictionary

                //            NSLog(@"pathArray: %@", pathArray);

                // Add values to dictionary
                if([[pathArray objectAtIndex:selectedShapeIndex] objectForKey:@"shape"])// if key 'shape' exist for the selected shape, if filled arrow is selected
                    [dict_path setValue:@"arrow" forKey:@"shape"]; // then there must be no affect on it while moving it
                [dict_path setValue:currentSelectedPath forKey:@"path"];
                [dict_path setValue:[[pathArray objectAtIndex:selectedShapeIndex] objectForKey:@"color"] forKey:@"color"];

                [pathArray removeObjectAtIndex:selectedShapeIndex];// REMOVING object frm pathArray
                NSDictionary *tempDict = [NSDictionary dictionaryWithDictionary:dict_path];
                [pathArray insertObject:tempDict atIndex:selectedShapeIndex];// addding selected shape at every pixel movement
                [dict_path removeAllObjects];

                CGPathRelease(_path);
                [self setNeedsDisplay];
    }
}


// here is my draw rect method
- (void)drawRect:(CGRect)rect
{

    for(NSDictionary *_pathDict in pathArray)
    {
        if([_pathDict objectForKey:@"shape"])// if shape is arrow then fill it(shape key is taken for arrow)
        {
            [((UIColor *)[_pathDict valueForKey:@"color"]) setFill]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor)
            [[_pathDict valueForKey:@"path"] fill];
        }
        [((UIColor *)[_pathDict valueForKey:@"color"]) setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor)
        [[_pathDict valueForKey:@"path"] strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
    }

    if([dict_path objectForKey:@"shape"])
    {
        [[dict_path objectForKey:@"color"] setFill]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor)
        [[dict_path objectForKey:@"path"] fill];
    }

    [[dict_path objectForKey:@"color"] setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor)
    [[dict_path objectForKey:@"path"] strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];

}

-(void)deselectShape // deselect shape
{
    [centerline removeFromSuperlayer];
    isAnyShapeSelected = NO;
    [btnResize removeFromSuperview];

    // show hide delete button
    [self.delegate showDeleteButton:isAnyShapeSelected];//delegate to active and inactive delete button
}

For how to select a shape on touchesBegin see my anwer at How do I detect a touch on a UIBezierPath and move a ball along that?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top