質問

I'm trying to modify a the path of my CAShapeLayer and then redraw it using setNeedsDisplay,

But for some reason it wont redraw. The only way i can make it to be redrawn is calling viewDidLoad which i am sure is not the correct way.

Here is the code for initialisation:

self.shape.lineWidth = 2.0;
[self.shape setFillColor:[[UIColor clearColor] CGColor]];
self.shape.strokeColor = [[UIColor blackColor] CGColor];
[self.shape setPath:[self.shapePath CGPath]];
self.shape.fillRule = kCAFillModeRemoved;
[self.cuttingView.layer addSublayer:self.shape];

And the gesture recogniser for the drag gesture:

- (void)handlePan:(UIPanGestureRecognizer *)gesture
{
    static CGPoint lastLocation;
    CGPoint location = [gesture locationInView:self.cuttingView];

    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        if (![self.shapePath containsPoint:location] ) {
            gesture.enabled = NO;
        } else {
            lastLocation = location;
        }
    }

    if (gesture.state == UIGestureRecognizerStateChanged) {
        CGAffineTransform translation = CGAffineTransformMakeTranslation((location.x - lastLocation.x), (location.y - lastLocation.y));
        self.shapePath.CGPath = CGPathCreateCopyByTransformingPath(self.shapePath.CGPath, &translation);
        [self.shape setNeedsDisplay];
    }
    gesture.enabled = YES;
} 

I am printing the locations, and they do change, but the screen shows nothing.

How could this be fixed?

Thanks!

役に立ちましたか?

解決

You are changing self.shapePath.CGPath, but you are not changing the path in the CAShapeLayer.

Instead of [self.shape setNeedsDisplay], do this again:

[self.shape setPath:[self.shapePath CGPath]];

他のヒント

you don't assign the path to the layer. I'd remove the shapePath variable as it has no use (AFAICS)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top