2010-04-23 19 views
6

Tengo un CALayer que aplico una perspectiva para usar un CGTransform3D y especificar la propiedad m14. Cuando se aplica la perspectiva, la capa tiene bordes dentados. He oído a personas mencionar que agregar un borde transparente de 1px alrededor de la capa ayudará con esto. No sé cómo hacer eso. He intentado usar los border y borderWidth propiedades de un CALayer pero los bordes dentados aún están allí. También traté de reducir el rect que se dibuja por 1 píxel en todos los lados, pero no ayuda tampoco.iPhone - Bordes irregulares al aplicar perspectiva a CALayer

Cualquier ayuda sería grande! ¡Gracias!

Respuesta

3

Por "He oído a gente hablar de" Asumo que te refieres a la discusión sobre this question. Lo que se había sugerido para dibujar en realidad el contenido de su CALayer de modo que tenga un borde transparente de un píxel fuera del contenido básico, utilizando el código de

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

dentro de su dibujo de cuarzo para esa capa.

También existe la propiedad edgeAntialiasingMask en CALayer, pero he visto ningún impacto al usar un código como el siguiente:

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

en el anti-aliasing de bordes de la capa transformadas. Ver también this question para la discusión de este, así como la forma en que resuelven su problema usando un píxel bordes transparentes alrededor de sus imágenes.

10

La mejor solución que encontré para este problema fue establecer shouldRasterize en YES y establecer la escala de rasterización en la escala de la pantalla del dispositivo.

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

Eso a su vez suavizará los bordes para usted.

1

Da tu CALayer una máscara que es la inserción de 0,5 píxeles de cada borde:

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

Esto ya no parece funcionar en iOS 5.1 – wdlindmeier

0

A una frontera de píxeles suaviza los bordes del contenido de una capa (!):

- (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 desea utilizar las propiedades de borde de la capa, esto ya no funciona, porque el borde no es parte del contenido de la capa y no se ve afectado por el suavizado. Por otra parte, el ajuste shouldRasterize afecta tanto el contenido como los bordes.

0

En Swift 3.0:

context.setAllowsAntialiasing(true) 
context.setShouldAntialias(true) 
Cuestiones relacionadas