我有一个CALayer,我应用透视图来使用CGTransform3D
并指定m14
属性。应用透视时,图层具有锯齿状边缘。我听说有人提到在图层周围添加1px透明边框会有助于此。我不知道该怎么做。我尝试过使用CALayer的border
和borderWidth
属性,但锯齿状边缘仍然存在。我也试图减少所有方面1px绘制的矩形,但它也没有帮助。
任何帮助都会很棒!谢谢!
答案 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)