Domanda

Sto avendo un problema strano con CALayer disegno per l'iPhone. Ho uno strato radice che aggiunge un mazzo di sottostrati rappresentano "bolle". Il risultato finale dovrebbe essere simile a questa:

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

Il problema è che io non riesco a ottenere il livello di anti-alias (notare le scalettature sulle bolle). Il mio codice sovrascrivendo drawInContext per la CALayer bolla è la seguente:

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

}

Ora la cosa veramente strana è che se ho un po 'alterare il codice di disegno per disegnare solo normali cerchi rossi come segue:

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

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

Tutto sembra antialias OK:

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

Non riesco a capire questo comportamento apparentemente strano. Mi sto perdendo un po 'di differenza tra i gradienti di antialiasing e cerchi normali?

Grazie ragazzi.

È stato utile?

Soluzione

Grazie ragazzi. Così si scopre che la risposta è una combinazione dei vostri due risposte (Coob e Alex). Fondamentalmente sembra che la funzione ha solo CGDrawRadialGradient aliasing al cerchio di partenza, non la desinenza uno. Poiché desidero "bordi" aliasing su entrambi, ho messo la funzione di prelevare l'esterno che si occupa della prima "edge", ma produce i seguenti:

Fase 1

Poi, ho clip l'immagine come suggerito da Coob e che dà un bel aliasing intorno al bordo finale della bolla:

Fase 2

Sembra abbastanza buono per me!

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

}

Altri suggerimenti

Jeff -. Fare topCenter un po 'più lontano e utilizzare CGContextClipToMask con una maschera circolare

Modifica:. In realtà un modo molto molto migliore per farlo è quello di utilizzare un tracciato vettoriale ritaglio utilizzando CGContextClip

Modifica 2: Codice di esempio:

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

Aggiungi questo prima di disegnare il gradiente, e disegnare un po 'più lontano.

forse provare abbandono del kCGGradientDrawsAfterEndLocation? Si potrebbe fare qualcosa di strano con l'alfa

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top