2013-08-21 112 views
4

當渲染在IOS均勻顏色的不透明非梯度圓形形狀,似乎有三種可能的技術:在iOS中渲染圈子的最佳技術是什麼?

使用相似圖片circle-icon.png[email protected]。然後,可以執行以下代碼以使iOS自動呈現適當的大小:

UIImage *image = [UIImage imageNamed:@"circle-icon"]; 
self.closeIcon = [[UIImageView alloc] initWithImage:image]; 
self.closeIcon.frame = CGRectMake(300, 16, image.size.width, image.size.height); 

呈現圓角並使用圖層,如下所示:

self.circleView = [[UIView alloc] initWithFrame:CGRectMake(10,20,100,100)]; 
circleView.alpha = 0.5; 
self.circleView.layer.cornerRadius = 50; 
self.circleView.backgroundColor = [UIColor blueColor]; 

使用原生的繪圖庫,喜歡的東西CGContextFillEllipseInRect

什麼是這3個方案的具體性能和維護的權衡?

+1

使用全部三種編寫測試應用程序並通過Instruments運行。然後你會根據自己的需要知道確切的答案。 – rmaddy

+0

這可能有助於指示您繪製了多少個圓,以及繪製了多大的範圍(因爲例如如果圓很大,將會有UIImage方法的內存權衡)。如果性能是關鍵,我建議你對方法進行基準測試。我希望UIImage是最快的,CG *方法使用最少的內存。 –

+0

儘管我明白自己可以對其進行基準測試,但我想了解一些有關渲染的一般最佳實踐以及是否有已知的基準測試。 – zealoushacker

回答

3

你可以俯瞰另外一個非常合理的做法,UIBezierPathCAShapeLayer。創建一個圈爲UIBezierPath,創建一個使用UIBezierPathCAShapeLayer,然後將該圖層添加到視圖/圖層層次結構中。

  1. Add the QuartzCore framework to your project

  2. 二,導入適當的頭:

    #import <QuartzCore/QuartzCore.h> 
    
  3. 然後你就可以添加一個CAShapeLayer到您的視圖的層:

    UIBezierPath *path = [UIBezierPath bezierPath]; 
    [path addArcWithCenter:CGPointMake(self.view.bounds.size.width/2.0, self.view.bounds.size.height/2.0) radius:self.view.bounds.size.width * 0.40 startAngle:0 endAngle:M_PI * 2.0 clockwise:YES]; 
    CAShapeLayer *layer = [[CAShapeLayer alloc] init]; 
    layer.path = [path CGPath]; 
    layer.fillColor = [[UIColor blueColor] CGColor]; 
    [self.view.layer addSublayer:layer]; 
    

我認爲,無論是CoreGraphics中實現,或者這個CAShapeLayer實現比帶有圓角的PNG文件或UIView對象更有意義。

+0

啊非常酷。感謝您的替代! – zealoushacker

1

就我個人而言,我認爲你是在過度思考問題。如果你只畫幾圈,那麼無論你決定什麼,都會有非常小的性能/維護影響,即使你把它優化到了地獄,你的用戶也沒有從中受益。不管你現在在做什麼,專注於使應用的內容變得更加出色,如果您真的需要,請稍後再回到性能。

就這樣說,我會推薦使用繪圖庫。

  1. 四捨五入的角落是緩慢的,而非直觀
  2. 使用圖像文件將是一個問題,如果你決定做的東西一樣改變顏色。另外,有時圖像縮放後圖像看起來不太好。
+0

我在問這個問題時有這種感覺,但我想我會讓社區提供一些反饋:)謝謝。 – zealoushacker

3

最清晰和最好看的結果是有一個精確繪製的圖像,正是你想要的圓的大小。如果你調整圈子大小,你通常不會得到你想要的外觀,並且有一些與它們相關的開銷。

我覺得清潔和速度的最佳性能將來自使用核心圖形和及其附加在橢圓形的正方形:

CGPathRef roundPath = CGPathCreateMutable();  
CGRect rectThatIsASquare = CGRectMake(0, 0, 40, 40); 
CGPathAddEllipseInRect(roundPath, NULL, rectThatIsASquare); 
CGContextSetRGBFillColor(context, 0.7, 0.6, 0.5, 1.0); 

CGContextFillPath(context); 
相關問題