Изменение цвета пути CAShapeLayer

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

По сути, у меня есть представление с изображением (с использованием свойства содержимого слоя), и под этим слоем у меня есть слой рисования, который является 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];

}

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


person johnnyd    schedule 20.09.2011    source источник


Ответы (1)


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

person Micah Hainline    schedule 20.09.2011
comment
Спасибо за отзыв! Итак, по сути, вы говорите, что я должен сохранять каждый подконтур и соответствующий ему цвет для каждого касания (и последующей линии), которые я рисую? У меня было подозрение, что все сведется к этому, но я полагал, что это может стать крайне неэффективным, если бы у меня были, например, сотни подпутей (скажем, в массиве). Хм... может быть, я могу использовать пустое изображение и рисовать на нем вместо шейп-слоя? Я бы предположил, что это может быть более эффективным.... - person johnnyd; 20.09.2011
comment
Рисование в изображение является альтернативой, учитывая, что это необратимо. В качестве универсального решения я бы порекомендовал сохранить компоненты, но если изображение будет работать лучше для вас, во что бы то ни стало. :) - person Micah Hainline; 20.09.2011