Изменения цвета пути CAShapeLayer - PullRequest
1 голос
/ 20 сентября 2011

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

По сути, у меня есть вид с изображением (с использованием свойства содержимого слоя), и под этим слоем у меня есть слой Drawing, который является CAShapeLayer. На мой взгляд, где живут оба слоя, у меня также есть CALayerDelegate, который на данный момент просто рисует точку, используя CGPaths с заданным цветом в ответ на жест касания (селектор жестов касания вызывает setNeedsDisplay на CAShapeLayer). У меня проблема в том, что, если я меняю цвет, а затем нажмите на вид, все предыдущие точки автоматически станут вновь выбранным цветом ... не хорошо ... Мне нужен каждый подпуть (то есть точка), чтобы сохранить свой первоначальный цвет ... Возможно некоторый код будет пролить немного света на тему:

Делегат (Примечание: DrawingView.drawingPath используется повторно):

- (void)drawLayer:(CAShapeLayer *)theLayer
    inContext:(CGContextRef)theContext {


if (CGPointEqualToPoint(drawingView.startPoint, drawingView.endPoint)) {


    CGPathMoveToPoint(drawingView.drawingPath, NULL, drawingView.startPoint.x, drawingView.startPoint.y);
    CGPathAddEllipseInRect(drawingView.drawingPath, NULL, CGRectMake(drawingView.startPoint.x, drawingView.startPoint.y, drawingView.drawRadius, drawingView.drawRadius));

    CGContextSetFillColorWithColor(theContext, drawingView.currentColor.CGColor);
    CGContextBeginPath(theContext);
    CGContextAddPath(theContext, drawingView.drawingPath);
    CGContextFillPath(theContext);

}

}

И мой распознаватель жестов касания:

- (void)viewTapped:(UITapGestureRecognizer *)recognizer {

CGPoint touchPoint = [recognizer locationInView:recognizer.view];
startPoint = endPoint = touchPoint;
[drawingLayer setNeedsDisplay];

}

Я был бы в восторге, если бы кто-нибудь показал мне, что я здесь делаю неправильно! (

1 Ответ

1 голос
/ 20 сентября 2011

Каждый раз, когда вы перерисовываете свой слой, он будет использовать информацию, которую вы ранее сохранили (в данном случае в виде чертежа), чтобы нарисовать все.Вы должны быть в состоянии представить все на экране, используя только эту информацию.В этом случае у вас возникают проблемы, потому что вы не сохраняете достаточно информации.То, что вы хотите, это не просто путь для рисования и цвет, а серия путей и цветов для рисования.Вам нужно будет сохранить список объектов, содержащих обе эти вещи в вашем DrawingView, и перебирать их, рисуя каждый из них.Каждый раз, когда вы меняете текущий цвет, вам нужно следить за тем, что уже нарисовано, и сохранять его вместе со старым цветом, чтобы не потерять след того, какой цвет принадлежит какой части пути.

...