我有一个 CALayer,我将透视图应用于使用 aCGTransform3D
并指定m14
属性。应用透视时,图层的边缘呈锯齿状。我听说有人提到在图层周围添加一个 1px 的透明边框会有所帮助。我不知道该怎么做。我尝试使用 CALayer 的border
andborderWidth
属性,但锯齿状边缘仍然存在。我还尝试将在所有边上绘制 1px 的矩形减小,但这也无济于事。
任何帮助都会很棒!谢谢!
我有一个 CALayer,我将透视图应用于使用 aCGTransform3D
并指定m14
属性。应用透视时,图层的边缘呈锯齿状。我听说有人提到在图层周围添加一个 1px 的透明边框会有所帮助。我不知道该怎么做。我尝试使用 CALayer 的border
andborderWidth
属性,但锯齿状边缘仍然存在。我还尝试将在所有边上绘制 1px 的矩形减小,但这也无济于事。
任何帮助都会很棒!谢谢!
我为这个问题找到的最佳解决方案是将 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;
关于变换层边缘的抗锯齿。另请参阅此问题以讨论此问题,以及他们如何使用图像周围的单像素透明边框解决问题。
给你的 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;
一个像素的边框平滑了图层内容(!)的边缘:
- (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
另一方面,设置会影响内容和边框。
在 Swift 3.0 中:
context.setAllowsAntialiasing(true)
context.setShouldAntialias(true)