2010-04-23 98 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) 
相关问题