2017-03-12 27 views
0

나는 CGContext에이 완전히 모든 정보가 삭제됩니다cgcontext에서 그려진 경로를 가볍게 지우는 방법은 무엇입니까?

UIImageView *maskImgView = [self.view viewWithTag:K_MASKIMG]; 
    UIGraphicsBeginImageContext(maskImgView.image.size); 
    [maskImgView.image drawAtPoint:CGPointMake(0,0)]; 
    float alp = 0.5; 

    UIImage *oriBrush = [UIImage imageNamed:_brushName]; 

    //sets the style for the endpoints of lines drawn in a graphics context 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    CGFloat eraseSize = oriBrush.size.width*_brushSize/_zoomCurrentFactor; 

    CGContextSetLineCap(ctx, kCGLineCapRound); 
    CGContextSetLineJoin(ctx, kCGLineJoinRound); 
    CGContextSetLineWidth(ctx,eraseSize); 
    CGContextSetRGBStrokeColor(ctx, 1, 1, 1, alp); 
    CGContextSetBlendMode(ctx, kCGBlendModeClear); 


    CGContextBeginPath(ctx); 
    CGContextMoveToPoint(ctx, lastPoint.x,lastPoint.y); 

    CGPoint vector = CGPointMake(currentPoint.x - lastPoint.x, currentPoint.y - lastPoint.y); 
    CGFloat distance = hypotf(vector.x, vector.y); 
    vector.x /= distance; 
    vector.y /= distance; 

    for (CGFloat i = 0; i < distance; i += 1.0f) { 
     CGPoint p = CGPointMake(lastPoint.x + i * vector.x, lastPoint.y + i * vector.y); 
     CGContextAddLineToPoint(ctx, p.x, p.y); 
    } 

    CGContextStrokePath(ctx); 

    maskImgView.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    lastPoint = currentPoint; 

문제를 삭제 도면을 구현할 수 있었다. 이 함수에서 설정된 알파 (CGContextSetRGBStrokeColor(ctx, 1, 1, 1, alp);)는 완전히 무시 된 것 같습니다.

가볍게 지우고 반복적으로 지우고 싶다면 그림을 완전히 제거합니다.

아이디어가 있으십니까?

편집는 : 요청에 따라,이 코드에 대한 자세한 내용을 추가 ALP는 = _brushAlpha이의 ViewController 클래스에 delcared 속성입니다. 범위는 0.1 ~ 1.0입니다. 테스트 할 때 0.5로 설정했습니다. 이 드로잉 코드는 팬 제스처 인식기 (상태 변경)에 의해 트리거됩니다. 기본적으로 손가락을 따라갑니다 (손가락으로 그리거나 지우기).

+0

'alp'의 가치가 무엇인지 관객에게 친절하게 이야기 해 주시겠습니까? '_brushAlpha'는 무엇입니까? 그러나이 도면 코드는 어디에 있습니까? –

+0

Ok 코드에 대한 자세한 내용을 추가했습니다. – GeneCode

답변

1

블렌딩 모드를 해제로 설정했습니다. 그것은 획 색상을 무시합니다. 당신은 다양한 모드로 조금 놀아야 만하지만 sourceAtop이나 screen과 같은 것을 원한다고 생각합니다. 자세한 내용은 CGBlendMode docs을 참조하십시오.

+0

제안 해 주셔서 감사합니다. 오늘 밤 한번 시도해 볼게. – GeneCode

+1

kCGBlendModeDestinationOut을 사용하여 작동하도록했습니다. 감사합니다. 올바른 방향을 지적했습니다. – GeneCode

0

UIView에서 clearsContextBeforeDrawing이라는 플래그가 있습니다. YES로 설정하면 모든 추첨 전에 취소됩니다. 설명서에 따라

그리기 전에보기의 경계를 자동으로 지워야하는지 여부를 결정하는 부울 값. YES로 설정하면 drawRect : 메서드가 호출되기 전에 드로잉 버퍼가 자동으로 투명한 검정색으로 지워집니다. 이 동작은 뷰의 내용을 다시 그릴 때 시각적 인 인공물이 남지 않도록합니다. 뷰의 불투명도 속성도 YES로 설정되어 있으면 뷰의 backgroundColor 속성이 nil이 아니어야하거나 드로잉 오류가 발생할 수 있습니다. 이 등록 정보의 기본값은 YES입니다. 이 속성의 값을 NO로 설정하면 drawRect : 메서드에서 뷰의 내용이 올바르게 그려지도록해야합니다. 드로잉 코드가 이미 많이 최적화되어있는 경우이 속성을 NO로 설정하면 성능이 향상 될 수 있습니다. 특히 스크롤하는 동안 뷰의 일부만 다시 그려야하는 경우가 있습니다.

+0

drawRect를 사용하지 않기 때문에 clearsContextBeforeDrawing을 어떻게 사용할 수 있는지 잘 모르겠습니다. 자세한 내용을 추가하기 위해 제 질문을 수정했습니다. – GeneCode