2012-12-11 2 views
3

모든 컨텍스트를 다시 그리지 않고도 뷰에 선을 그리는 방법을 찾으려고합니다.그리기 전에 컨텍스트를 지우지 마십시오.

-(void)drawInContext:(CGContextRef)context { 
    for (int i = 0; i < self.drawings.count; ++i) { 
     Drawing* drawing = [self.drawings objectAtIndex:i]; 

     CGContextSetStrokeColorWithColor(context, drawing.colorTrait.CGColor); 
     CGContextSetLineWidth(context, 1.0); 

     CGContextMoveToPoint(context, [[drawing.points objectAtIndex:0] CGPointValue].x * self.zoomScale, [[drawing.points objectAtIndex:] CGPointValue].y * self.zoomScale); 

     for (int i = 1; i < drawing.points.count; i++) { 
      CGContextAddLineToPoint(context, [[drawing.points objectAtIndex:i] CGPointValue].x * self.zoomScale, [[drawing.points objectAtIndex:i] CGPointValue].y * self.zoomScale); 
     } 

     CGContextStrokePath(context); 
    } 
} 

-(void)drawRect:(CGRect)rect { 
    if (isRedrawing) { 
     [self drawInContext:UIGraphicsGetCurrentContext()]; 
     isRedrawing = NO; 
    } 

    [[UIColor redColor] set]; 
    [currentPath stroke]; 
} 

하지만 내 접촉 방법에 setNeedsDisplay를 호출 할 때, 뷰가 완전히 지워집니다 :

은 여기 내 그리기 방법이다. 내 방법을 작동시키는 방법이 있습니까?

답변

3
더 들어

나쁘 내가 사용하는 층 :

- (void)drawRect:(CGRect)rect { 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    if (first) { 

     // Wait for the first call to get a valid context 

     first = NO; 

     // Then create a CGContextRef (offlineContext_1) and matching CGLayer (layer_1) 

     layer_1 = CGLayerCreateWithContext (context,self.bounds.size, NULL);  
     offlineContext_1 = CGLayerGetContext (layer_1); 

     // If you have any pending graphics to draw, draw them now on offlineContext_1 

    } 

    // Normally graphics calls are made here, but the use of an "offline" context means the graphics calls can be made any time. 

    CGContextSaveGState(context); 

    // Write whatever is in offlineContext_1 to the UIView's context 

    CGContextDrawLayerAtPoint (context, CGPointZero, layer_1); 
    CGContextRestoreGState(context); 

} 

아이디어가있는 UIView의 컨텍스트는 항상 클리어하지만, 레이어와 관련된 오프라인 상황이되지 않는 것입니다. 그래픽 작업을 계속 누적 할 수 있으며 drawRect에 의해 지워지지 않도록 할 수 있습니다.

편집 : 그래서 당신은 문제와 내가 해결 한 것과의 한 가지 차이점을 지적했습니다. 첫 번째 디스플레이가 끝날 때까지 아무 것도 그릴 필요가없는 반면 첫 번째 디스플레이 전에는 무언가를 그려야했습니다. 내가 기억하는 바로는 언제든지 크기와 해상도에 관계없이 레이어를 만들 수 있습니다. 나에게 전달 될 올바른 컨텍스트 (현재 장치의 올바른 설정 사용)를 기다린 다음 해당 컨텍스트를 기반으로 새 컨텍스트/레이어를 만드는 것이 가장 쉬운 방법이라는 것을 알았습니다. "if (first)"블록의 안쪽을보십시오.

동일한 작업을 수행 할 수 있지만 첫 번째 drawRect :가 호출 될 때까지 서버에서 가져온 행 등을 캐싱해야합니다. 그런 다음 지정된 컨텍스트로 오프라인 컨텍스트를 만들고 서버에서 오프라인 컨텍스트로 가져온 선 등을 그린 다음 아래와 같이 레이어를 그릴 수 있습니다. 따라서 메서드에 추가 할 수있는 유일한 방법은 "if (first)"루프를 호출하여 계속 진행하기 전에 보류중인 서버 소스 그래픽을 그리는 것입니다 (소스에 추가 된 주석 참조).

+0

drawRect에서 어디에서 drawInContext() 메서드를 호출 할 수 있습니까? – Seb

+0

@Seb 아이디어는 offlineContext에서 발생하는 제스처 및 기타 사용자 작업 집합을 사용자에게 발생시키는 것입니다. 또한 ** setNeedsDisplay : true **를 호출하면 UIView 자체가 다시 그려집니다. 다시 그리면 자체 지워지지만 모든 그래픽 기록이 포함 된 레이어가 복사됩니다. –

+0

이 선택의 이유를 이해했다고 생각하지만 내 앱과 함께 사용하는 방법을 이해할 수는 없습니다. 나는 서버가 나를 보내는 줄을 가지고 있으며, 처음 시작할 때 그 줄을 그림에 그려 넣고 싶다. 그 후 모든 것을 다시 그리지 않고 새로운 선을 그립니다. 사실, 당신의 방법으로 (나는 아무것도 변경하지 않았습니다.) 새로운 그림을 만든 후에는 내 그림이 전혀 표시되지 않고 선이 지워집니다. 나는 명확합니까? 더 정밀하게 설명해 주시겠습니까? 죄송합니다, 초보자입니다 .../ – Seb

관련 문제