4

Ich habe ein seltsames Problem mit CALayer Zeichnung für das iPhone. Ich habe eine Root-Ebene, die eine Reihe von Sublayern hinzufügt, die "Bubbles" darstellen. Das Endergebnis soll so etwas wie folgt aussehen:CALayer und CGGradientRef Anti-Aliasing?

http://www.expensivedna.com/IMG_0018.PNG http://www.expensivedna.com/IMG_0018.PNG

Das Problem ist, dass ich nicht die Schicht Anti-Aliasing zu bekommen scheinen (beachten Sie die jaggies auf die Blasen). Mein Code drawInContext für die Blasen CALayer Überschreiben ist wie folgt:

- (void)drawInContext:(CGContextRef)theContext{ 
CGContextSetAllowsAntialiasing(theContext, true); 
CGContextSetShouldAntialias(theContext, true); 

size_t num_locations = 2; 
CGFloat locations[2] = { 0.0, 1.0 }; 
CGFloat components[8] = { 1.0, 1.0, 1.0, 0.5, // Start color 
          1.0, 1.0, 1.0, 0.0 }; // End color 
CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
CGGradientRef glossGradient = 
CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); 

CGPoint topCenter = CGPointMake(25, 20); 
CGPoint midCenter = CGPointMake(25, 25); 
CGContextDrawRadialGradient(theContext, glossGradient, midCenter, 20, topCenter, 10, kCGGradientDrawsAfterEndLocation); 

}

Nun ist die wirklich Seltsame ist, dass, wenn ich etwas den Zeichencode ändern, um nur normale rote Kreise ziehen wie folgt:

- (void)drawInContext:(CGContextRef)theContext{ 
CGContextSetAllowsAntialiasing(theContext, true); 
CGContextSetShouldAntialias(theContext, true); 

CGContextSetFillColorWithColor(theContext, [UIColor redColor].CGColor); 
CGContextFillEllipseInRect(theContext, CGRectMake(0, 0, 40,40)); 
} 

Alles scheint zu Anti-Aliasing-OK:

http://www.expensivedna.com/IMG_0017.PNG http://www.expensivedna.com/IMG_0017.PNG

Ich kann dieses anscheinend merkwürdige Verhalten nicht herausfinden. Fehle mir ein Unterschied zwischen Antialiasing-Gradienten und normalen Kreisen?

Danke Jungs.

Antwort

4

Danke Jungs. Es stellt sich also heraus, dass die Antwort eine Kombination Ihrer beiden Antworten ist (cob und Alex). Grundsätzlich scheint es, als hätte die CGDrawRadialGradient-Funktion nur Aliasing im Startkreis, nicht das Ende. Da I ​​aliased „Kanten“ auf beiden will, ich zuerst die Funktion von innen nach außen zu ziehen, die Versorgung der ersten „edge“ annimmt, aber erzeugt die folgende:

Step 1

Dann Clip I die Bild wie von cooB vorgeschlagen und das gibt einen schönen Aliasing um die letzte Kante der Blase:

Step 2

Sieht gut genug für mich!

- (void)drawInContext:(CGContextRef)theContext{ 
CGContextSetAllowsAntialiasing(theContext, true); 
CGContextSetShouldAntialias(theContext, true); 

size_t num_locations = 2; 
CGFloat locations[2] = { 0.0, 1.0 }; 
CGFloat components[8] = { 1.0, 1.0, 1.0, 0.0, // Start color 
       1.0, 1.0, 1.0, 0.5 }; // End color 
CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
CGGradientRef glossGradient = 
CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); 

CGContextAddEllipseInRect(theContext, CGRectMake(5, 5, 40, 40)); 
CGContextClip(theContext); 

CGPoint topCenter = CGPointMake(25, 20); 
CGPoint midCenter = CGPointMake(25, 25); 
CGContextDrawRadialGradient(theContext, glossGradient, topCenter, 10, midCenter, 20, kCGGradientDrawsAfterEndLocation); 

}

0

vielleicht versuchen, die kCGGradientDrawsAfterEndLocation ablegen? Es könnte etwas komisches mit dem Alpha machen

2

Jeff - make topCenter ein wenig weiter und verwenden CGContextClipToMask mit einer kreisförmigen Maske.

Edit: Eigentlich ein viel viel besserer Weg ist es, einen Vektor-Clipping-Pfad mit CGContextClip zu verwenden.

Edit 2: Beispielcode:

CGContextAddEllipseInRect(theContext, CGRectMake(20, 20, 10, 10)); 
CGContextClip(theContext); 

diese hinzufügen, bevor Sie Ihr Gefälle ziehen, und es ein bisschen weiter aus ziehen.

+0

Tipp: Hat meinen rect durch einen 1 Punkt Einsatz jaggies hier vollständig zu eliminieren. – mattorb