2011-06-05 2 views
14

Lorsque je définis la propriété de transformation de ma CALayer avec un CATransform3DRotate, la couche est correctement pivotée. Cependant, les bords de la couche sont irréguliers et non anti-aliasés. J'ai lu les messages couple sur le sujet:Arêtes diagonales anti-alias de CALayer

iPhone: CALayer + rotate in 3D + antialias?

iPhone - Jagged Edges when applying perspective to CALayer

J'ai essayé d'intégrer leurs conseils en définissant les propriétés suivantes sur ma couche diagonale

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; 

I 'ai également surchargé le drawLayer: inContext: méthode de ma couche diagonale pour assurer l'anti-aliasing:

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

Qu'est-ce qui me manque?

Répondre

14

Je viens de faire un post sur ce sujet pour les images. Peut-être que ça va aider.

J'ai trouvé quelques astuces qui m'aident et le réglage d'une bordure n'a pas fait ce que je pensais. Ce que vous pouvez faire est de définir quelques paramètres pour aider à l'interpolation, la rastérisation et la rasterisationScale.

Voir si quelque chose de ce code aide:

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; 

J'ai quelques exemples posté here

+0

Génial! Super article. – tassock

+5

Il existe une alternative massivement meilleure sur 7.0 et plus tard. http://stackoverflow.com/questions/6245276/anti-alias-diagonal-edges-of-calayer/19443644#19443644 – cbowns

29

Au iOS 7, cela est enfin possible sur une base par couche et sans hacks laid comme des pixels transparents ou des solutions de contournement comme tramage:

layer.allowsEdgeAntialiasing = YES;

intéressant de noter que cela couvre pas édité par la documentation officielle de CALayer, mais est définitivement une API publique. Voir le iOS7 API diffs et l'excellent article de Peter Steinberger sur Hidden Gems and Workarounds in iOS7.

+0

Ceci est ma nouvelle API CA préférée. – cbowns

+0

Ce n'est pas possible sur OSX :( 'allowEdgeAntialiasing' n'est pas disponible Comment le feriez-vous sous OSX? –