2011-06-05 78 views
14

当我使用CATransform3DRotate对CALayer的transform属性进行设置时,图层会正确旋转。但是,图层的边缘是锯齿状的,不会消除锯齿。我读过关于这个问题的一些文章:CALayer的抗混叠对角线边缘

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); 
} 

我错过了什么?

回答

14

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

我发现了一些技巧,帮助和设置一个边界没有做我认为会的。你可以做的是设置一些设置来帮助插值,栅格化和栅格化比例。

看看从这个代码一些帮助:

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

+0

太棒了!好帖子。 – tassock 2011-09-11 22:00:11

+5

7.0和更高版本中有一个更好的选择。 http://stackoverflow.com/questions/6245276/anti-alias-diagonal-edges-of-calayer/19443644#19443644 – cbowns 2014-02-28 01:03:10

29

随着iOS7的,这是现在终于可以在每个层的基础,没有任何丑陋的黑客像透明像素或解决方法等光栅化:

layer.allowsEdgeAntialiasing = YES;

有趣的是,这是不覆盖由官方的CALayer文档编辑,但绝对是一个公共API。请参阅iOS7 API diffs和Peter Steinberger在Hidden Gems and Workarounds in iOS7上的精彩文章。

+0

这是我最喜欢的CA API。 – cbowns 2014-02-28 01:02:51

+0

这是不可能在OSX上:( 'allowedEdgeAntialiasing'不可用。您如何在OSX中执行此操作? – 2017-08-11 20:09:01