2011-06-05 106 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