6

我有一个 CALayer,我将透视图应用于使用 aCGTransform3D并指定m14属性。应用透视时,图层的边缘呈锯齿状。我听说有人提到在图层周围添加一个 1px 的透明边框会有所帮助。我不知道该怎么做。我尝试使用 CALayer 的borderandborderWidth属性,但锯齿状边缘仍然存在。我还尝试将在所有边上绘制 1px 的矩形减小,但这也无济于事。

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

4

5 回答 5

11

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

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

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

于 2011-08-23T04:53:56.643 回答
3

通过“我听说过人们提到”,我假设您的意思是关于这个问题的讨论。有人建议在 CALayer 中实际绘制内容,使其在核心内容之外具有一个像素的透明边框,使用代码

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

在该图层的 Quartz 绘图中。

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

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

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

于 2010-04-23T22:02:34.633 回答
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;
于 2012-01-03T05:30:28.680 回答
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另一方面,设置会影响内容和边框。

于 2012-07-27T12:18:42.383 回答
0

在 Swift 3.0 中:

context.setAllowsAntialiasing(true)
context.setShouldAntialias(true)
于 2016-11-11T23:09:59.017 回答