2010-02-02 3 views
4

그라디언트 배경으로 내 자신의 UITableViewCell을 생성합니다. 나는 모든 논리와 그림 밖으로 일했다,하지만 난 수정하려는 한 가지 내 사용자 지정 셀의 모서리 주위에 "chunkiness"입니다 : 당신이 코너를 확대하면코어 그래픽에서 둥근 선을 부드럽게하기

alt text http://grab.by/27SM

, 당신이 볼 수 내가 말하는거야. 다음은 셀을 생성하는 데 사용하는 코드입니다.

CGContextRef c = UIGraphicsGetCurrentContext(); 
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB(); 
CGGradientRef myGradient = nil; 
CGFloat components[8] = TABLE_CELL_BACKGROUND; 
CGContextSetStrokeColorWithColor(c, [[UAColor colorWithWhite:0.7 alpha:1] CGColor]); 
CGContextSetLineWidth(c, 2); 
CGContextSetAllowsAntialiasing(c, YES); 
CGContextSetShouldAntialias(c, YES); 
CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ; 
CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ; 

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathMoveToPoint(path, NULL, minx, miny); 
CGPathAddArcToPoint(path, NULL, minx, maxy, midx, maxy, kDefaultMargin); 
CGPathAddArcToPoint(path, NULL, maxx, maxy, maxx, miny, kDefaultMargin); 
CGPathAddLineToPoint(path, NULL, maxx, miny); 
CGPathAddLineToPoint(path, NULL, minx, miny); 
CGPathCloseSubpath(path); 

// Fill and stroke the path 
CGContextSaveGState(c); 
CGContextAddPath(c, path); 
CGContextClip(c); 

CGFloat locations[2] = { 0.0, 1.0 }; 
CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND; 
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB(); 
myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2); 
CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0); 

CGContextRestoreGState(c); 
CGContextAddPath(c, path); 
CGContextStrokePath(c); 

모든 셀에서 일관된 가장자리 두께를 유지하면서 가장자리를 부드럽게하려면 어떻게해야합니까?

답변

7

너의 선 너비는 2 포인트로 설정됩니다. 무슨 일이 일어나고있는 것은 코드가 선의 너비를 이해하지 않고 경계 rect를 계산하고 있다는 것입니다. 결과는 모양의 모든 직선 세그먼트에 대해 획의 너비의 절반 만 보입니다. 호에는 전체 스트로크 너비가 표시됩니다.

다음은 내 앱인 Funversation의 관련 코드 세그먼트로, 사용자가 가지고있는 것과 유사한 둥근 모서리가있는 카드를 그립니다.

CGRect rect = [self bounds]; 
rect.size.width -= lineWidth; 
rect.size.height -= lineWidth; 
rect.origin.x += lineWidth/2.0; 
rect.origin.y += lineWidth/2.0; 

등 할망구, midx, MAXX, 대한 계산 전에를 추가하고 모양의 스트로크는 균일해야한다.

+1

이 방법은 Peter의 방법보다 부드러 웠습니다. http://grab.by/2836 – coneybeare

+0

좋은 답변입니다. 즉시 내 줄을 개선했습니다. 감사! – typeoneerror

1

획을 일관성있게 만드는 다른 방법은 AddPath 및 StrokePath 호출을 RestoreGState 호출 위로 이동하는 것입니다. 즉, 클리핑하는 동안 획입니다.

이 솔루션을 사용하면 2 와이드 폭의 획을 그릴 때 그래픽 상태에 넣은 선의 너비를 두 배로 간단히 설정합니다 (즉, 4pt로 설정). 그 중 절반이 잘 리기 때문입니다.

+0

이것은 효과가 있었지만 Giao의 방법만큼 부드럽지 않았습니다 http://grab.by/2832 – coneybeare