2010-04-23 12 views
6

J'ai un CALayer que j'applique une perspective à l'aide d'un CGTransform3D et en spécifiant la propriété m14. Lorsque la perspective est appliquée, la couche a des bords irréguliers. J'ai entendu des gens mentionner que l'ajout d'une bordure transparente 1px autour de la couche aidera à cela. Je ne sais pas comment faire ça. J'ai essayé d'utiliser les propriétés border et borderWidth d'un CALayer mais les bords dentelés sont toujours là. J'ai aussi essayé de réduire le rectangle dessiné par 1px de tous les côtés, mais ça n'aide pas non plus.iPhone - Jagged Edges lors de l'application de perspective à CALayer

Toute aide serait géniale! Merci!

Répondre

3

Par "J'ai entendu des gens mentionner", je suppose que vous voulez dire la discussion sur this question. Ce qui a été suggéré il y avait de tirer réellement le contenu de votre CALayer afin qu'il ait une bordure transparente d'un pixel en dehors du contenu de base, en utilisant le code

CGContextSetAllowsAntialiasing(theContext, true); 
CGContextSetShouldAntialias(theContext, true); 

au sein de votre dessin quartz pour cette couche.

Il y a aussi la propriété edgeAntialiasingMask sur CALayer, mais j'ai vu aucun impact lorsque vous utilisez le code comme suit:

layer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge; 

sur le anticrénelage des bords de la couche transformées. Voir aussi this question pour la discussion de ceci, ainsi que la façon dont ils ont résolu leur problème en utilisant des bordures transparentes d'un pixel autour de leurs images.

10

La meilleure solution que j'ai trouvée pour ce problème était de définir shouldRasterize sur YES et de définir l'échelle de rastérisation à l'échelle de l'écran du périphérique.

myLayer.shouldRasterize = YES; 
myLayer.rasterizationScale = UIScreen.mainScreen().scale // iOS 
myLayer.rasterizationScale = NSScreen.mainScreen()!.backingScaleFactor // OSX 

Cela va à son tour lisser les bords pour vous.

1

Donnez votre CALayer un masque qui est encadré 0,5 px de chaque bord:

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; 
+1

Ce ne semble plus fonctionner dans iOS 5.1 – wdlindmeier

0

une bordure de pixels permet de lisser les bords du contenu d'une couche (!):

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

Si vous Si vous voulez utiliser les propriétés de bordure du calque, cela ne fonctionne plus, car la bordure ne fait pas partie du contenu de la couche et n'est pas affectée par le lissage.

Le paramètre shouldRasterize affecte à la fois le contenu et les bordures.

0

Swift 3.0:

context.setAllowsAntialiasing(true) 
context.setShouldAntialias(true)