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

iPhone-将透视应用于CALayer时出现锯齿状边缘,iphone,uikit,core-animation,core-graphics,calayer,Iphone,Uikit,Core Animation,Core Graphics,Calayer,我有一个CALayer,我应用透视图来使用CGTransform3D并指定m14属性。应用透视时,层具有锯齿状边缘。我听说有人提到,在图层周围添加1像素的透明边框将有助于实现这一点。我不知道怎么做。我曾尝试使用CALayer的边框和边框宽度属性,但锯齿状边缘仍然存在。我还试图减少由1px在所有边上绘制的矩形,但这也没有帮助 任何帮助都会很好!谢谢 我听到人们提到,“我想你指的是关于……的讨论。建议在CALayer中实际绘制内容,以便使用代码在核心内容外具有一个像素的透明边框 CGContextS

我有一个CALayer,我应用透视图来使用
CGTransform3D
并指定
m14
属性。应用透视时,层具有锯齿状边缘。我听说有人提到,在图层周围添加1像素的透明边框将有助于实现这一点。我不知道怎么做。我曾尝试使用CALayer的
边框
边框宽度
属性,但锯齿状边缘仍然存在。我还试图减少由1px在所有边上绘制的矩形,但这也没有帮助

任何帮助都会很好!谢谢

我听到人们提到,“我想你指的是关于……的讨论。建议在CALayer中实际绘制内容,以便使用代码在核心内容外具有一个像素的透明边框

CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);
在该层的石英图纸中

CALayer上还有
edgeAntialiasingMask
属性,但我发现在使用如下代码时没有任何影响:

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

关于变换层边的抗锯齿。有关此问题的讨论,以及他们如何在图像周围使用单像素透明边框解决问题,请参见。

我找到的解决此问题的最佳方法是将shouldRasterize设置为YES,并将光栅化比例设置为设备屏幕的比例

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

这将反过来为您平滑边缘。

为您的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;

单像素边框平滑图层内容(!)的边缘:

- (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;
}
如果要使用图层的边框特性,这将不再有效,因为边框不是图层内容的一部分,并且不受平滑的影响

另一方面,设置
应光栅化
会影响内容和边框。

在Swift 3.0中:

context.setAllowsAntialiasing(true)
context.setShouldAntialias(true)