2011-12-13 5 views
2

가 나는 UIBezierPath을 짓고 있어요 그러나CAShapeLayer 그리기 경로가 이상하게

CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init]; 
[shapeLayer setFrame:aFrame]; 
[shapeLayer setPath:[bezierPath CGPath]]; 
[shapeLayer setStrokeColor:[[UIColor blackColor] CGColor]]; 
[shapeLayer setMasksToBounds:YES]; 

, 내 스크롤 뷰에 추가, 여기 있습니다 결과 :

Path Image

가 왜이 합니까? 첫 번째 네 줄은 회색입니다. 앨리어싱 문제인 것처럼 보이지만 경로는 매우 간단합니다.

답변

5

예이 문제는 에일리어싱 문제입니다.

사용하는 경로의 너비는 1pt입니다. 위의 예에서 CAShapeLayer의 상위 세 인스턴스는 전체 점 값에 정확하게 가운데에 배치됩니다 (예 : 5.0, 여기서 하위 인스턴스는 두 개의 전체 점 사이에 위치합니다. 14.5.

시스템이 화면 픽셀에 레이어를 렌더링 할 때 투명도가 50 % 인 두 개의 터치 된 픽셀을 그리면서 처음 세 줄을 에일리어스합니다. 하단 선은 픽셀에 완벽하게 배치되므로 완벽한 검정색으로 그려집니다.

약간의 ASCII 아트가 이해를 돕기를 바랍니다.

pt   upper lines       lower line 
5.0|---------          ------------------------------- 
    | pixel -------------------------------------- perfectly aligned center 5.5 
6.0|--------- line between pixels centered on 6.0 ------------------------------- 
    | pixel -------------------------------------- 
7.0|--------- 
+0

확실히 그렇습니다.하지만 내 경로 코드가 실제로이 작업을 수행하는 이유는 무엇입니까? "거리"를 12.0과 같다고 가정합니다. 그것은 모든 포인트에 해당해야합니다. – DexterW

0

나는 같은 상황을 가지고있다 : 수직과 수평 검은 선이 회색이된다.

CALayer가 아니라 픽셀의 UiView '스냅'좌표와 유사합니다.

이 문제에 대한 해결책은 코디네이트에 0.5를 더하는 것입니다.

CGRect bounds_on_pixels(const CGRect& bounds) { 

    const float f = 0.5f; 
    return CGRectMake(bounds.origin.x+f, bounds.origin.y+f, bounds.size.width-1.f, bounds.size.height-1.f); 
} 

참고 : -1.f 크기는 통용적입니다. CAShapeLayer로 사용하고 UIBezierPath

CAShapeLayer* shape_layer = [CAShapeLayer layer]; 
// initialize shape_layer... 
shape_layer.path = 
[ 
UIBezierPath bezierPathWithRoundedRect:bounds_on_pixels(self.view.bounds) 
byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight 
cornerRadii:CGSizeMake(10.0, 10.0) 
].CGPath; 
// add shape_layer: [self.view.layer insertSublayer:shape_layer atIndex:0]; 

@tonklon의

예 : 아이디어에 대한 들으!

관련 문제