2013-07-24 50 views
3

我有一個組件,它有一個UIView子類和一個自定義的CAlayer。CALayer和UIView的差異圖

在UIView的存在是繪製CoreGraphics中的圓圈,這是代碼:

CGRect b = self.bounds; 

int strokeSize = 2; 
CGRect arcBounds = CGRectMake(b.origin.x+1, b.origin.y+1, b.size.width-2, b.size.height-2); 

CGContextSaveGState(ctx); {  
    CGContextSetLineWidth(ctx, strokeSize); 
    CGContextSetStrokeColorWithColor(ctx, [UIColor lightGrayColor].CGColor); 
    CGContextStrokeEllipseInRect(ctx, arcBounds); 
} CGContextRestoreGState(ctx); 

當我繪製了UIView內drawRect方法是圓它完美的作品和繪製圓光滑,看起來不錯。

問題出現在我畫另一個圓時,但第二個畫在CALayer中,實際上是在我的自定義CALayer的drawInContext方法中。使用相同的代碼,圓圈看起來不太好,並且在邊界上有一些「像素化」。

任何可能發生的線索的線索?提前致謝。

回答

3

這是由於contentsScale屬性。當你有一個自定義的CALayer時,這個屬性的默認值是1.0。

此屬性的默認值爲1.0。對於連接到 視圖的圖層,視圖會自動將比例因子更改爲適合當前屏幕的值 。對於您創建的圖層並自行管理,您必須根據屏幕的分辨率和您提供的內容來自行設置此屬性的值。 。核心動畫使用您指定的值作爲提示 確定如何呈現您的內容。 Source.

如果你有一個視網膜設備,你用contentsScale設置爲1.0繪製,它會導致你描述的像素化的外觀。爲了解決這個問題,你應該將圖層的contentsScale設置爲屏幕的其中一個。

[self.layer setContentsScale:[[UIScreen mainScreen] scale]];

當你畫的圓圈在UIViewdrawRect方法,因爲有默認contentsScaleFactor已經是屏幕的一個,此問題不會發生。

對於意見認爲實現自定義drawRect:方法和相關聯 具有窗口,該屬性的缺省值是與屏幕當前顯示的視圖相關聯的比例因子 。 Source.