2010-03-17 4 views
7

Wir haben Reiner Knizias Geld für ein paar Monate heraus gehabt. Es ist ziemlich gut gemacht, und so haben wir es aktualisiert, wie die Zeit es erlaubt. Eines jedoch nervt mich weiterhin. Ich konnte meine Layered-Karten nie richtig anti-aliasieren lassen.Wie zu Anti-Alias ​​Schichten in iPhoneOS

Hier ist ein Beispiel:

alt text

Karten, die gerade verlegt sind sehr sauber, aber wann immer sie sind gewinkelt die schwarzen Linien um die Karten gezackten bekommen. Ich habe dieses probiert, das von beiden Linien abhängt, die zu der Grafik und den Linien durch drawRect: impliziert werden, und sie tun beide die gleiche Sache. Ich habe versucht, die edgeAntiAliasingMask und es macht nichts, was ich sagen kann. Ich habe masksToBounds für die Sublayer ausprobiert, die auf NO und YES gesetzt sind.

Gerade jetzt ist meine Karte als CALayer einrichten, die sub-CALayers für die vorne und hinten, sowie ein paar andere Dinge wie ein Blitz und eine Verdunkelung Maske Maske hat. Hier einige Auszüge aus dem Code:

CArdLayer *theCardLayer = [CArdLayer layer]; 
    theCardLayer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge; 

    theCardLayer.front = [CALayer layer]; 
    theCardLayer.front.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge; 
    theCardLayer.front.bounds = theCardLayer.bounds; 
    theCardLayer.front.masksToBounds = YES; 
    theCardLayer.front.contents = (id)[cardDrawing CGImage]; 

    [theCardLayer addSublayer:theCardLayer.front]; 

Etc ...

Alle Ideen, wie die Karten tatsächlich Anti-Aliasing zu machen?

+0

Diese Frage ist ähnlich: http://stackoverflow.com/questions/1136110/any-quick-and-dirty-anti-aliasing-techniques -for-a-rotierte-uiimageview (die Frage bezieht sich auf UIImageView, aber die vorgeschlagenen Fixes funktionieren für alle CoreAnimation-Layer). –

Antwort

3

Das beste Ergebnis, das ich mir vorstellen konnte, war das, was ich vorgeschlagen habe Kommentar: Ich habe jede (transparente) Grafik um 1 Pixel auf jeder Seite vergrößert. Mit diesem kleinen Rand haben sich die Karten mit dem Hintergrund viel besser zusammengesetzt.

Also, nicht genau eine iPhone-Code-Antwort, aber eine, die dennoch auf dem iPhone funktioniert.

Hier ist ein „nach“ Schuss, der Sie in die „vor“ vergleichen kann, oben: alt text

+0

Hallo Shannon, Wie haben Sie die Striche um ein transparentes Pixel auf jeder Seite erweitert? Können Sie das Code-Snippet freigeben? Vielen Dank. –

+0

Photoshop. Ich habe dort jede Datei geöffnet und die Leinwandgröße um 2 Pixel in beide Richtungen erweitert. –

1

Ich habe das Framework nie benutzt, aber es sieht so aus, als ob das Anti-Aliasing nur auf der Innenseite der Karte funktioniert, nicht auf der Außenseite (vorausgesetzt, die abgerundeten Ecken bei nicht gedrehten Karten sind ein Sonderfall).

Also IMHO ist es eigentlich ein Zusammensetzung Problem von Karten und Hintergrund.

Ein kurzer Blick auf the docs bietet einige Hinweise (nur Annahmen, versuchen sie):

Stellen Sie sicher, Opaque Eigenschaft falsch ist (vielleicht, was Sie sehen, ist das Ergebnis einer Optimierung der Rendering-Code).

Überprüfen Sie, wie es aussieht, wenn Sie die Opazität auf "fast undurchsichtig" (vielleicht 0,9?) Einstellen.

Überprüfen Sie die Mask Eigenschaft. Es sollte Ihnen erlauben, eine Maske wie einen Alpha-Kanal mit weichen Rändern zu erstellen - obwohl ich weiß, dass es nicht wirklich das ist, was Sie wollen ...

+0

Danke für die Antwort. Weder die Opak- noch die Opazitätseigenschaft machen einen Unterschied. Ich habe jedoch festgehalten, dass das Anti-Aliasing nur auf der Innenseite der Karte funktioniert. Ich habe also versucht, eine meiner Karten um ein (transparentes) Pixel auf jeder Seite zu erweitern. Das Ergebnis ist, dass die Striche (die sich derzeit in der eigentlichen Kartengrafik befinden) viel weicher sind. Also, das sieht wie eine Lösung aus, aber jede Grafik 2x2 Pixel größer zu machen, als es sein muss scheint kludgy, also hat jemand irgendwelche Ideen, bevor ich das tue? –

4

Dies hat den Effekt einer transparenten Grenze der Zugabe:

layer.cornerRadius = 1.01;