2010-04-23 4 views
6

Ho un CALayer che applico una prospettiva all'utilizzo di CGTransform3D e che specifica la proprietà m14. Quando viene applicata la prospettiva, il livello presenta bordi frastagliati. Ho sentito dire che aggiungere un bordo trasparente di 1pz attorno al livello ti aiuterà. Non so come farlo. Ho provato a utilizzare le proprietà border e borderWidth di un CALayer ma i bordi frastagliati sono ancora lì. Ho anche provato a ridurre il rect disegnato da 1px su tutti i lati, ma non aiuta neanche.iPhone - Bordi frastagliati quando si applica la prospettiva a CALayer

Qualsiasi aiuto sarebbe fantastico! Grazie!

risposta

3

Da "Ho sentito parlare di persone", presumo tu intenda la discussione su this question. Quanto suggerito c'era disegnare effettivamente contenuto nella CALayer modo che abbia un bordo trasparente di un pixel di fuori del contenuto di base, utilizzando il codice

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

all'interno del disegno quarzo per quel livello.

C'è anche la proprietà edgeAntialiasingMask su CALayer, ma ho visto alcun impatto quando si utilizza il codice simile al seguente:

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

sulla antialiasing dei bordi del livello trasformati. Vedi anche this question per la discussione di questo, e come hanno risolto il loro problema usando bordi trasparenti di un pixel attorno alle loro immagini.

10

La soluzione migliore che ho trovato per questo problema era impostare shouldRasterize su YES e impostare la scala di rasterizzazione sulla scala dello schermo del dispositivo.

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

Questo a sua volta appianare i bordi per voi.

1

Lascia la tua CALayer una maschera che è inserto 0,5 px da ogni bordo:

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

Questo non sembra più funzionare in iOS 5.1 – wdlindmeier

0

A una frontiera pixel leviga i bordi del contenuto di un livello (!):

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

Se vuoi usare le proprietà del bordo del livello, questo non funziona più, perché il bordo non fa parte del contenuto del livello e non è influenzato dal livellamento.

L'impostazione shouldRasterize ha invece effetto sul contenuto e sui bordi.

0

In Swift 3.0:

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