2010-04-23 99 views
6

我有CALayer,我將視角應用於使用CGTransform3D並指定m14屬性。當應用透視圖時,圖層邊緣呈鋸齒狀。我聽說有人提到在圖層周圍添加1px透明邊框可以幫助實現這一點。我不知道該怎麼做。我曾嘗試使用CALayer的borderborderWidth屬性,但鋸齒狀的邊緣仍然存在。我也試圖減少在所有方面以1px繪製的矩形,但它也沒有幫助。iPhone - 將視角應用於CALayer時的鋸齒邊緣

任何幫助將是偉大的!謝謝!

回答

3

通過「我聽說過人們提到,」我假設你的意思是this question的討論。有什麼建議有實際繪製的內容在你的CALayer,使其具有的核心內容之外的一個像素的透明邊框,使用該層的石英繪圖中的代碼

CGContextSetAllowsAntialiasing(theContext, true); 
CGContextSetShouldAntialias(theContext, true); 

還有上的CALayer的edgeAntialiasingMask屬性,但我一直在使用如下代碼時看到任何影響:

layer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge; 

上變換層邊緣抗鋸齒。關於這一點的討論,請參閱this question,以及他們如何在圖像周圍使用一個像素透明邊框來解決問題。

10

我發現這個問題的最佳解決方案是將shouldRasterize設置爲YES,並將光柵化比例設置爲設備屏幕的比例。

myLayer.shouldRasterize = YES; 
myLayer.rasterizationScale = UIScreen.mainScreen().scale // iOS 
myLayer.rasterizationScale = NSScreen.mainScreen()!.backingScaleFactor // OSX 

這將反過來平滑邊緣爲您服務。

1

給您的CALayer面具這是嵌入每個邊緣0.5 PX:

UIView *aliasedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)]; 

CALayer *maskLayer = [[CALayer alloc] init]; 
maskLayer.frame = CGRectMake(0.5, 0.5, width-1, height-1); 
maskLayer.backgroundColor = [UIColor whiteColor].CGColor; 

aliasedView.layer.mask = maskLayer; 
+1

這似乎不再是iOS中5.1工作 – wdlindmeier 2012-03-13 05:18:36

0

一個像素的邊框平滑的內容的邊緣層(!):

- (UIImage *)drawAntiAliased:(UIImage *)image 
{ 
    const int B = 1; // Border width (anti-aliasing) 

    // Size of the output image 
    CGSize newImageSize = CGSizeMake(image.size.width + 2 * B, image.size.height + 2 * B); 

    UIGraphicsBeginImageContextWithOptions(newImageSize, NO, 0); 

    // Draw image with edge anti-aliasing 
    [image drawInRect:(CGRect){B, B, image.size}]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return newImage; 
} 

如果您想要使用圖層的邊框屬性,這不再起作用,因爲邊框不是圖層內容的一部分,並且不受平滑的影響。

另一方面,設置shouldRasterize同時影響內容和邊框。

0

在雨燕3.0:

context.setAllowsAntialiasing(true) 
context.setShouldAntialias(true) 
相關問題