Search code examples
iosuibezierpathcgpath

Reposition CGPath/UIBezierPath in View


How can I update position of an already drawn CGPath/UIBezierPath on a view? I would like to move or change a path's position and then perhaps call the drawInRect method to just render the path again.


Solution

  • From your question it sounds like you are drawing the path using Core Graphics inside drawRect: (as compared to using a CAShapeLayer) so I'll explain the version first.

    Moving a CGPath

    You can create a new path by transforming another path. A translation transform moves the transformed object a certain distance in x and y. So using a translation transform you can move your existing path a certain number of points in both x and y.

    CGAffineTransform translation = CGAffineTransformMakeTranslation(xPixelsToMove,
                                                                     yPixelsToMove);
    CGPathRef movedPath = CGPathCreateCopyByTransformingPath(originalCGPath,
                                                             &translation);
    

    Then you could use the movedPath to draw the same way you are already doing.

    You could also change modify the same path

    yourPath = CGPathCreateCopyByTransformingPath(yourPath,
                                                  &translation);
    

    and simply redraw it.

    Moving a shape layer

    If you are using a shape layer, moving it is even easier. Then you only have to change the position of the layer using the position property.

    Update:

    If you want to use a shape layer you can simply create a new CAShapeLayer and set its path to be your CGPath. You will need QuartzCore.framework for this since CAShapeLayer is part of Core Animation.

    CAShapeLayer *shape = [CAShapeLayer layer];
    shape.path = yourCGParth;
    shape.fillColor = [UIColor redColor].CGColor;
    
    [someView.layer addSublayer:shape];
    

    Then to move the shape you simply change its position.

    shape.position = thePointYouWantToMoveTheShapeTo;