2010-04-23 8 views
6

Ich habe eine CALayer, die ich eine Perspektive auf die Verwendung eines CGTransform3D anwenden und die m14 Eigenschaft angeben. Wenn die Perspektive angewendet wird, hat die Ebene gezackte Kanten. Ich habe gehört, dass das Hinzufügen eines 1px transparenten Rahmens um die Ebene dabei hilft. Ich weiß nicht, wie ich das machen soll. Ich habe versucht, die border und borderWidth Eigenschaften eines CALayer, aber die gezackten Kanten sind immer noch da. Ich habe auch versucht, das Rect zu reduzieren, das von allen Seiten mit 1px gezeichnet wird, aber es hilft auch nicht.iPhone - Gezackte Kanten beim Anwenden der Perspektive auf CALayer

Jede Hilfe wäre großartig! Vielen Dank!

Antwort

3

Von "Ich habe gehört, Leute zu erwähnen," Ich nehme an, Sie meinen die Diskussion auf this question. Was war vorgeschlagen wurde es tatsächlich den Inhalt in Ihrem CALayer zu ziehen, so dass es außerhalb des Kerninhaltes einen Ein-Pixel-transparenten Rand hat, für diese Schicht des Code mit

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

in Ihrer Quarz Zeichnung.

Es gibt auch die edgeAntialiasingMask Eigenschaft auf CALayer, aber ich habe keinen Einfluss gesehen, wenn Code wie folgt aus:

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

auf der Anti-Aliasing-transformierter Schicht Kanten. Siehe auch this question für die Diskussion darüber, und wie sie ihr Problem gelöst haben, indem sie ein Pixel transparente Ränder um ihre Bilder herum verwendeten.

10

Die beste Lösung, die ich für dieses Problem gefunden habe, war es, sugarasterize auf YES zu setzen und den Rasterungsmaßstab auf den Bildschirm des Geräts einzustellen.

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

Das wiederum wird die Kanten für Sie glätten.

1

Geben Sie Ihren CALayer eine Maske, die von jedem Rande Inset 0,5 px ist:

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

Diese nicht mehr in iOS zu funktionieren scheint 5.1 – wdlindmeier

0

A ein Pixel Grenze glättet die Kanten des Inhalts einer Ebene (!):

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

Wenn Sie Möchten Sie die Rahmeneigenschaften des Layers verwenden, funktioniert dies nicht mehr, da der Rahmen nicht Teil des Layers ist und nicht von der Glättung beeinflusst wird.

Einstellung shouldRasterize auf der anderen Seite betrifft sowohl den Inhalt und die Grenzen.

0

In Swift 3.0:

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