2013-05-14 2 views
1
CGContextRef currentContext = UIGraphicsGetCurrentContext(); 

CGContextSetStrokeColorWithColor(currentContext, hh2DarkGray.CGColor); 
CGFloat lengths[] = {0, 8}; 
CGContextSetLineCap(currentContext, kCGLineCapRound); 
CGContextSetLineWidth(currentContext, 1); 
CGContextSetLineDash(currentContext, 0.0f, lengths, 2); 

CGContextBeginPath(currentContext); 
CGContextMoveToPoint(currentContext, x1, y1); 
CGContextAddLineToPoint(currentContext, x2, y2); 

CGContextClosePath(currentContext); 
CGContextDrawPath(currentContext, kCGPathStroke); 

도트가 고르게 배치되지 않도록 위의 코드에서 내가 뭘 잘못하고 있니? 이 모양입니다.왜이 점이 제대로 표시되지 않습니까?

. .. .. .. .. .. .. .. .. .. .. ... 이 모양이 필요할 때 . . . . . . . . . . . . . . .

나는 완전히 잃어 버렸고 내가 찾을 수있는 다른 모든 게시물은 이런 종류의 문제를 지적하지 않는다. 도와주세요? 당신 라인의 좌표에 0.5를 추가

+0

[0, 4] 대시 패턴은 사용자가 원하는 것처럼 보이지 않습니다. CGContextSetLineDash에 대한 문서는 다음과 같이 말합니다 : 예를 들어, 값이 [2,3] 인 배열을 전달하면 2 사용자 공간 단위 길이의 칠한 세그먼트와 3 사용자 공간 단위 길이가 교대로 나타나는 대시 패턴이 설정됩니다 도색되지 않은 세그먼트. 값 [1,3,4,2]을 전달하면 패턴이 1 단위 페인트 세그먼트, 3 단위 페인트되지 않은 세그먼트, 4 단위 페인트 세그먼트 및 2 단위 도색되지 않은 세그먼트로 설정됩니다. –

+0

어쩌면 몇 가지 값을 제안 해 주시겠습니까? 나는 여러 가지 다른 방법을 시도해 왔으며 전에 문서를 읽었습니다. [0, 4]는 그것을 균등하게 배치하지만 점 사이에 더 많은 공간이 필요합니다. 지금은 0, 8 그리고 그 위에 무엇입니까. 잘못된 값을 복사했습니다. 나는 그것을 포스트에서 바꿀 것이다. – user2282932

+0

페인트 된 세그먼트의 길이를 '0'이외의 값으로 변경하십시오. {4,4} 시도 ... –

답변

4

문제는 경로을 닫고 있다는 것입니다. 이것은 암시 적으로 첫 번째 점으로 줄을 그립니다. 패스가 두 점 사이의 직선으로 구성되어 있으면 기본적으로 두 선을 서로 위에 직접 그려서 점을 추가로 표시합니다. 두 번째 선은 대시 패턴에 오프셋이있는 두 번째 선입니다.

해결책 : CGContextClosePath으로 전화를 제거하면됩니다.

대시 패턴으로 {0, 8} 대신 {1, 8}을 사용하는 것이 더 논리적 일 것입니다. 한 지점을 그려야하기 때문에 논리적이지만, 실제로는 차이가 나는 것처럼 보이지 않습니다.

+1

거룩한 수생 !!! 고맙습니다!!!! 나는 그것이 그와 비슷한 것이라는 의심을 품었지만, 나는 길이는 어디에도 없었습니다. 다시 한번 감사드립니다. – user2282932

0

봅니다 :

CGContextMoveToPoint(currentContext, x1 + 0.5, y1 + 0.5); 
CGContextAddLineToPoint(currentContext, x2 + 0.5, y2 + 0.5); 

당신은 픽셀 인덱스에서 논리적 좌표로 생각하지해야합니다. 픽셀 완벽한 선을 그릴 때 일부 픽셀 중심의 좌표를 전달해야합니다. 그렇지 않으면 반올림 아티팩트가 표시됩니다.

+0

고마워. 그러나 아무런 차이가없는 것 같습니다. 나는 단지 0.5 분의 값으로 너무 혼란 스러웠다. 다른 아이디어? – user2282932

관련 문제