CGContext를 사용하여 도색되지 않은 대시 세그먼트로 시작하는 선을 그리는 방법은 무엇입니까?

스테판 팔머

CGContext를 사용하면 그린 세그먼트로 시작하는 파선을 쉽게 그릴 수 있습니다.

using (var ctx = UIGraphics.GetCurrentContext())
{
    ctx.BeginPath();
    //... draw a path here
    var pattern = new float[] { 2, 2 };
    ctx.SetLineDash(0, pattern);
    ctx.DrawPath(CGPathDrawingMode.Stroke);
}

이것은 "xx--xx--xx--xx--"처럼 보이는 선을 그립니다. 여기서 "x"는 페인트를 의미하고 "-"는 페인트하지 않음을 의미합니다.

이제 페인트되지 않은 세그먼트, 즉 "--xx--xx--xx--xx"로 시작하는 선을 그리려고합니다. 이것을 달성하는 우아한 방법이 있습니까? 예를 들어 iOS에 도색되지 않은 세그먼트로 시작하도록 지시하는 방식으로?

예를 들어, 페인팅되지 않은 세그먼트로 시작하는 선은 phase 매개 변수를 사용하여 얻을 수 있습니다.

using (var ctx = UIGraphics.GetCurrentContext())
{
    ctx.BeginPath();
    //... draw a path here
    var pattern = new float[] { 2, 2 };
    ctx.SetLineDash(2, pattern);
    ctx.DrawPath(CGPathDrawingMode.Stroke);
}

그러나 더 복잡한 패턴 (와 같은 { 2, 4, 3, 7, 5, 6 })의 경우 phase 매개 변수를 사용하는 것이 더 번거로워집니다. 위상 매개 변수와 함께 패턴을 이동해야 할 수 있습니다.

마무리하기 : 위상 매개 변수를 사용하지 않고 도색되지 않은 세그먼트로 시작하는 선 대시를 우아하게 만들 수 있습니까?

참고 : 코드 예제는 C # (MonoTouch)으로 작성되었지만이 질문은 네이티브 iOS 코드에도 적용됩니다.

스테판 팔머

간단한 솔루션

라인 대시 기능 만 사용하면 위상 매개 변수없이 주어진 문제를 해결할 수 없습니다. 대시 배열을 재정렬하고 위상을 설정하여 해결할 수 있습니다.

도색되지 않은 세그먼트로 시작하려면 마지막 대시 배열 항목을 앞으로 이동하고 동일한 값으로 위상을 설정합니다. 예를 들어 패턴 -xx-xx-xx-xx-xx...이 필요한 경우 1, 2위상 0 의 대시 배열은와 같은 패턴으로 이어집니다 x--x--x--x--.... 2, 1단계 2 의 대시 배열 -xx-xx-xx-xx-xx...은 원하는대로 패턴 으로 이어집니다.

적응 된 패턴 반복으로 확장 된 솔루션

iOS는 항상 페인트 된 세그먼트와 페인트되지 않은 세그먼트를 번갈아 가며 대시 배열이 반복 될 때 재설정되지 않습니다. 예를 들어 대시 배열 1, 2, 1은 다음과 같은 선 패턴을 생성 x--x-xx-x--x...합니다. 우리의 경우 전체 패턴이 반복되기를 원했습니다. 즉, 주어진 대시 배열을 사용하면 선 패턴이 다음과 같아야 x--xx--xx--xx...합니다.

이를 달성하려면 대시 배열에 항상 짝수의 요소가 있는지 확인해야합니다. 대시 배열을 재정렬하고 단계를 설정하는 것 외에도 요소를 조정하고 제거해야합니다. 고려해야 할 네 가지 사례가 있습니다.

1. 색칠 된 세그먼트, 짝수의 세그먼트로 시작합니다.

여기서 할게 없어. 대시 배열을 그대로 사용하십시오. 위상은 0입니다.

2. 도색되지 않은 세그먼트, 짝수의 세그먼트로 시작합니다.

마지막 대시 배열 항목을 앞으로 이동하고 동일한 값으로 위상을 설정합니다. 위의 간단한 예를 참조하십시오.

3. 색칠 된 세그먼트, 홀수 세그먼트로 시작합니다.

첫 번째 항목에 마지막 대시 배열 항목을 추가합니다. 마지막 항목을 제거하십시오. 원래 마지막 대시 배열 항목과 동일한 위상을 설정합니다.

예를 들어 대시 배열 1, 2, 1은 일반적으로 패턴으로 이어집니다 x--x-xx-.... 2, 2위상이 1 인 대시 배열 은 원하는 패턴으로 이어집니다 x--xx--xx--....

4. 도색되지 않은 세그먼트, 홀수의 세그먼트로 시작합니다.

첫 번째 대시 배열 항목을 마지막 항목에 추가합니다. 첫 번째 항목을 제거하십시오. 모든 항목의 합계에서 원래의 첫 번째 대시 배열 항목을 뺀 것과 동일한 위상을 설정합니다 (이렇게하면 본질적으로 패턴이 끝 근처에서 시작하여 원래 첫 항목을 마지막 항목에 추가 한 위치에서 정확히 시작할 수 있습니다).

예를 들어 대시 배열 1, 2, 1은 일반적으로 패턴으로 이어집니다 x--x-xx-.... 패턴 2, 2의 원하는 패턴 (3 개)의 리드와 함께 위상 -xx--xx--xx....

대안

라인 대시 기능을 사용 하지 않는 대안 은 @ user2320861이 설명하는 것일 수 있습니다. @ user2320861은 배경색을 사용하여 패턴이있는 선이있는 실선 위에 칠할 것을 제안합니다. 배경색이 알려져 있고 균일 한 배경이 사용되는 경우이 방법이 잘 작동합니다.

다양한 배경 (예 : 이미지)에 대한 변형 은 패턴 화 된 선을 그려 클리핑 마스크 ( CGContextClipToMask) 를 설정하는 것 입니다. 그런 다음이 클리핑 마스크로 실선을 그릴 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관