2009-05-02 5 views
5

iPhone/Touch SDK를 사용하여 일부 선을 그리려하고 있습니다. 라인의 색을 바꿀 수 있지만 CGContextSetRGBStrokeColor를 호출하면 CGContextStrokePath에 대한 실제 호출이 이루어질 때까지 CGContextAddLineToPoint로 그려진 선에 영향을 미치지 않는 것 같습니다. 따라서 색상을 변경하기 위해 여러 번 호출하면 CGContextStrokePath 직전에 만들어진 것만 효과가 있습니다. 여기에 무슨 뜻입니까 :CGContextStrokePath를 사용하여 색상 변경

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextMoveToPoint(ctx, 0, 0); 
    CGContextSetRGBStrokeColor(ctx,1,0,0,1); 
    CGContextAddLineToPoint(ctx, 100, 100); 
    //CGContextStrokePath(ctx); 
    CGContextSetRGBStrokeColor(ctx,0,1,0,1); 
    CGContextAddLineToPoint(ctx, 200, 300); 
    //CGContextStrokePath(ctx); 
    CGContextSetRGBStrokeColor(ctx,0,0,1,1); 
    CGContextStrokePath(ctx); 
} 

나는 무언가를 잘못하고 있다고 가정합니다. CGContextStrokePath 호출을 추가하면 도움이된다는 생각이 들었습니다.

내가 수정 된 코드에 도착하는 방법은 아래

참조 토론 :

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextBeginPath(ctx); 
    CGContextMoveToPoint(ctx, 0, 0); 
    CGContextSetRGBStrokeColor(ctx,1,0,0,1); 
    CGContextAddLineToPoint(ctx, 100, 100); 
    CGContextStrokePath(ctx); 
    CGContextClosePath(ctx); 
    CGContextBeginPath(ctx); 
    CGContextMoveToPoint(ctx, 100, 100); 
    CGContextSetRGBStrokeColor(ctx,0,1,0,1); 
    CGContextAddLineToPoint(ctx, 200, 300); 
    CGContextStrokePath(ctx); 
} 

답변

4

나는 주어진 그래픽 컨텍스트에 대한 CGContextStrokePath는 하나의 RGBStrokeColor에있을 수 있습니다 만, 당신이 끔찍하게 잘못 아무것도 생각하지 않습니다 시간. 결과적으로 CGContextStrokePath에 대한 여러 호출이 각 색상에 한 번 필요합니다.

CGContextAddLineToPoint()를 호출 할 때마다 그래픽 컨텍스트에 대한 참조 (복사본이 아님)가 해당 드로잉 작업 스택에 추가됩니다. 마지막으로 CGContextStrokePath()를 호출하면 RGBStrokeColor의 마지막 값이 사용됩니다.

동일한 그래픽 컨텍스트에서 여러 색상을 사용하려는 경우 그래픽 컨텍스트에서 호출간에 RGBStrokeColor() 값을 변경하는 CGContextStrokePath()를 여러 번 호출해야합니다. AccelerometerGraph/GraphView.m의 Apple 샘플 코드에서도이를 나타냅니다.

+0

흠, 결론은 CGContextStrokePath (ctx) 행을 주석 처리하지 않은 시뮬레이터에서 위의 코드를 실행하면 빨간색으로 그려진 첫 번째 줄을 얻습니다. 그것이해야하는 것처럼 보이는 것은 빨간색으로 첫 번째 선을 그린 다음 두 번째 선을 녹색으로 그립니다. 그러나 아이폰 시뮬레이터에서 실행하면 어떻게되는지는 알 수 없습니다. – stinkymatt

+0

아마도 첫 번째 전화를 걸면 현재 경로 (시작 지점 포함)가 삭제됩니까? Apple docs에 따르면 - "Quartz는 그래픽 상태의 선 너비와 획 색상을 사용하여 패스를 페인트합니다.이 함수를 호출 할 때 부작용으로 Quartz가 현재 경로를 지 웁니다." –

+0

먼저, 지워진 단어 사용에 대해 감사드립니다. 그것은 내 즐겨 찾기 중 하나입니다. 둘째로, 다른 방법으로 문서를 보는 데 도움을 주셔서 감사합니다. CGContextBeginPath (ctx)를 호출하면됩니다. 그런 다음 획 색상을 변경하고 시작점을 이동 한 다음 선을 추가 한 다음 선을 치고 닫습니다. 후속 선분에 대해 반복하십시오. 나는 후손을 위해 원래의 게시물에 수정 된 코드를 추가하려고 노력할 것이다. 감사! – stinkymatt