我有一个CALayer,使用CGTransform3D并指定m14属性来应用透视效果。当透视效果应用时,图层的边缘会出现锯齿状。我听说在图层周围添加1像素的透明边框可以解决这个问题。但我不知道如何做。我已经尝试使用CALayer的border和borderWidth属性,但锯齿依然存在。我还尝试将绘制的矩形沿着所有边缘缩小1像素,但也没有帮助。任何帮助都将不胜感激!谢谢!
我发现解决这个问题的最佳方案是将shouldRasterize设置为YES,并将光栅化比例设置为设备屏幕的比例。
myLayer.shouldRasterize = YES;
myLayer.rasterizationScale = UIScreen.mainScreen().scale // iOS
myLayer.rasterizationScale = NSScreen.mainScreen()!.backingScaleFactor // OSX
那样做将会为你平滑边缘。我假设你所说的“我听到人们提到”是指在这个问题上的讨论。那里建议实际上在CALayer中绘制内容,使其具有核心内容外部的一个像素透明边框,使用以下代码:
CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);
在该层的Quartz绘图中。
CALayer还有一个edgeAntialiasingMask
属性,但是当使用以下代码时,我没有看到任何影响:
layer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge;
关于转换图层边缘的反锯齿处理。另请参见此问题,讨论了这个问题,以及他们如何使用一像素透明边框解决了它们的问题。
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;
}
shouldRasterize
可以同时影响到内容和边框。context.setAllowsAntialiasing(true)
context.setShouldAntialias(true)