iPhone - 应用透视到CALayer时出现锯齿状边缘

6
我有一个CALayer,使用CGTransform3D并指定m14属性来应用透视效果。当透视效果应用时,图层的边缘会出现锯齿状。我听说在图层周围添加1像素的透明边框可以解决这个问题。但我不知道如何做。我已经尝试使用CALayer的border和borderWidth属性,但锯齿依然存在。我还尝试将绘制的矩形沿着所有边缘缩小1像素,但也没有帮助。任何帮助都将不胜感激!谢谢!
5个回答

11

我发现解决这个问题的最佳方案是将shouldRasterize设置为YES,并将光栅化比例设置为设备屏幕的比例。

myLayer.shouldRasterize = YES;
myLayer.rasterizationScale = UIScreen.mainScreen().scale // iOS
myLayer.rasterizationScale = NSScreen.mainScreen()!.backingScaleFactor // OSX
那样做将会为你平滑边缘。

3

我假设你所说的“我听到人们提到”是指在这个问题上的讨论。那里建议实际上在CALayer中绘制内容,使其具有核心内容外部的一个像素透明边框,使用以下代码:

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

在该层的Quartz绘图中。

CALayer还有一个edgeAntialiasingMask属性,但是当使用以下代码时,我没有看到任何影响:

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

关于转换图层边缘的反锯齿处理。另请参见此问题,讨论了这个问题,以及他们如何使用一像素透明边框解决了它们的问题。


1
将您的CALayer设置一个遮罩,该遮罩从每个边缘向内镶嵌0.5像素:
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;

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
在Swift 3.0中:
context.setAllowsAntialiasing(true)
context.setShouldAntialias(true)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接