2011-09-20 71 views
1

所以,我知道我的问题的标题可能不是最描述,所以我会通过它跑这里来了:CAShapeLayer路径变为彩色

基本上我有什么是观点与图像(使用层的内容属性),在这一层下,我有一个绘图层,它是一个CAShapeLayer。在我看来两个图层都有生命的情况下,我还有一个CALayerDelegate,现在只需使用具有给定颜色的CGPaths绘制一个点,以响应点击手势(点击手势选择器调用CAShapeLayer上的setNeedsDisplay)。我遇到的问题是,如果我改变颜色,然后点击视图所有以前的点自动成为新选择的颜色...不好...我需要每个子路径(即点),以保持其原来的颜色...也许一些代码将阐明的话题多一点光:

委托(注: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

每次重绘图层时,它都会使用先前保存的信息(在本例中是在绘图视图中)来绘制所有内容,只能使用这些信息来表示屏幕上的所有内容。在这种情况下,你遇到了麻烦,因为你没有保存足够的信息,你想要的不仅仅是一个绘图路径和一个颜色,而是一系列绘图路径和颜色,你需要保存一个包含两个对象的列表在你的drawingView中绘制这些东西,并遍历它们,绘制每一个,每次你改变当前的颜色,你需要跟踪已经绘制的东西并将它与旧颜色一起保存,这样你就不会失去跟踪哪一种颜色属于路径的哪一部分。

+0

感谢您的输入!So ess你所说的内容是我必须“保存”每个子路径及其对应的颜色,以便绘制每个水龙头(以及后面的线)?我怀疑它会降低到这一点,但我会想象,如果我有例如数百个子路径(例如在数组中),它可能变得非常低效。嗯...也许我可以使用一个空的图像,并绘制到它而不是shapelayer?我想这可能会更有效率.... – johnnyd

+0

绘制成图像是一种替代方案,铭记它不可逆。作为一个通用的解决方案,我建议保存这些组件,但是如果一张图像能够为您更好地工作,无论如何。 :) –