2010-02-02 55 views
4

我正在創建自己的具有漸變背景的UITableViewCells。我把所有的邏輯和圖紙製定出來,但有一點我想解決的是「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點。發生什麼事是你的代碼正在計算你的邊界矩形而不理解這條線的寬度。結果是,對於形狀的每個直線段,只有筆劃寬度的一半是可見的。在圓弧上,全行程寬度是可見的。

下面是我的應用程序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 2010-02-02 03:11:10

+0

真是個好的答案。立即改善我的線條。謝謝! – typeoneerror 2011-08-09 02:53:11

1

使筆畫保持一致的另一種方法是將AddPath和StrokePath調用移動到RestoreGState調用的上方 - 即剪切時的筆劃。

對於使用此解決方案的真正2磅寬的筆劃,只需將您在圖形狀態下放置的線寬加倍(即將其設置爲4 pt),因爲它的一半將被裁剪掉。

+0

這有效,但它不像Giao的方法http://grab.by/2832 – coneybeare 2010-02-02 03:10:37