CALayer的反别名对角线边缘

时间:2011-06-05 19:22:56

标签: iphone ios core-animation calayer antialiasing

当我使用CATransform3DRotate设置CALayer的transform属性时,图层被正确旋转。但是,图层的边缘是锯齿状的,没有消除锯齿。我已经阅读了几篇关于这个主题的帖子:

iPhone: CALayer + rotate in 3D + antialias?

iPhone - Jagged Edges when applying perspective to CALayer

我试图通过在对角线层上设置以下属性来结合他们的建议

CALayer* layer = myView.layer;
layer.shadowOpacity = 0.01;
layer.edgeAntialiasingMask = kCALayerTopEdge | kCALayerBottomEdge | kCALayerRightEdge | kCALayerLeftEdge;
layer.borderWidth = 1.0;
layer.borderColor = [UIColor clearColor].CGColor;
layer.backgroundColor = [UIColor greenColor].CGColor;

我还覆盖了drawLayer:inContext:对角层的方法以确保消除锯齿:

-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context
{
    CGContextSetAllowsAntialiasing(context, true);
    CGContextSetShouldAntialias(context, true);
    CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor);
    CGContextFillRect(context, self.bounds);
}

我错过了什么?

2 个答案:

答案 0 :(得分:30)

从iOS7开始,现在终于可以在每层上进行,并且没有任何丑陋的黑客攻击,如透明像素或光栅化等变通方法:

layer.allowsEdgeAntialiasing = YES;

有趣的是,CALayer官方文档没有涵盖这一点,但绝对是一个公共API。请参阅iOS7 API diffs和Peter Steinberger关于Hidden Gems and Workarounds in iOS7的精彩文章。

答案 1 :(得分:14)

我刚刚在这张照片上做了一个帖子。也许它会有所帮助。

我找到了一些帮助和设置边界没有按照我的想法做的技巧。你可以做的是设置一些设置来帮助插值,栅格化和rasterisationScale。

查看此代码中的某些内容是否有帮助:

    UIImage * img =[UIImage imageWithData:[NSData dataWithContentsOfFile:[[[NSBundle mainBundle ] resourcePath ] stringByAppendingPathComponent:@"AliasImage.png" ] ] ];
CGRect imageRect = CGRectMake( 0 , 0 , img.size.width + 4 , img.size.height + 4 );
UIGraphicsBeginImageContext( imageRect.size );
[img drawInRect:CGRectMake( imageRect.origin.x + 2 , imageRect.origin.y + 2 , imageRect.size.width - 4 , imageRect.size.height - 4 ) ];
CGContextSetInterpolationQuality( UIGraphicsGetCurrentContext() , kCGInterpolationHigh );
img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[aliasImage setImage:img ];

aliasImage.transform = CGAffineTransformScale(aliasImage.transform , 0.45 , 0.45 );
aliasImage.layer.shouldRasterize = YES;
aliasImage.layer.rasterizationScale = 0.45;
aliasImage.layer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge;
aliasImage.clipsToBounds = NO;
aliasImage.layer.masksToBounds = NO;

我发布了一些here

的例子