iPhone - 将视角应用于CALayer时的锯齿状边缘

时间:2010-04-23 20:25:47

标签: iphone uikit core-animation core-graphics calayer

我有一个CALayer,我应用透视图来使用CGTransform3D并指定m14属性。应用透视时,图层具有锯齿状边缘。我听说有人提到在图层周围添加1px透明边框会有助于此。我不知道该怎么做。我尝试过使用CALayer的borderborderWidth属性,但锯齿状边缘仍然存在。我也试图减少所有方面1px绘制的矩形,但它也没有帮助。

任何帮助都会很棒!谢谢!

5 个答案:

答案 0 :(得分:11)

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

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

这将为你平滑边缘。

答案 1 :(得分:3)

“我听过有人提到”,我认为你的意思是对this question的讨论。建议实际绘制CALayer中的内容,使其在核心内容之外有一个像素透明边框,使用代码

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

在该图层的Quartz图形中。

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

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

关于变换层边缘的抗锯齿。另请参阅this question以了解此问题,以及他们如何使用图像周围的单像素透明边框解决问题。

答案 2 :(得分: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;

答案 3 :(得分: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会影响内容和边框。

答案 4 :(得分:0)

在Swift 3.0中:

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