2010-01-31 2 views
7

Ich habe festgestellt, dass beim Platzieren von PNG-Bildern in einer Ansicht mit IB und/oder Animieren dieser Bilder an verschiedenen Positionen um eine Ansicht, das Bild manchmal ein leichte Unschärfe.Warum wird ein PNG-Bild manchmal verschwommen, abhängig von seiner Position in einer Ansicht?

In den meisten Fällen kann ich die Unschärfe beheben, indem ich 0,5 Bildpunkte zur Bildposition hinzufüge.

[lbLiteButton.layer setPosition:CGPointMake(140.5,159.5)]; 

Manchmal muss ich sowohl x als auch y wie oben einstellen. Manchmal muss ich nur x oder y anpassen.

Ich erinnere mich irgendwo zu lesen, dass dies mit der Größe des Bildes und wie Kern Animation funktioniert und etwas mit halben Pixeln zu tun ... aber ich finde den Artikel nirgendwo !?

Das Problem mit der ".5 Pixel" -Lösung ist, dass es für jedes PNG-Bild je nach Größe unterschiedlich ist, so dass Sie benutzerdefinierte Animation nicht wiederverwenden können, weil Sie sie für jedes andere Bild anpassen müssen.

  1. Gibt es eine Möglichkeit sicherzustellen, dass egal wo ich mein Bild platziere oder animiere, ich keine unscharfen Positionen bekomme?
  2. Hat jemand Informationen dazu?

Vielen Dank!

+0

Was sind die Abmessungen Ihres Bildes? Ist die Breite oder Höhe ungerade? –

Antwort

14

Die position-Eigenschaft eines View-Layers basiert auf seiner anchorPoint-Eigenschaft. Standardmäßig ist dies (0,5, 0,5), was bedeutet, dass der Ankerpunkt der Ebene in der Mitte liegt. Wenn Ihre Ansicht (und ihre Ebene) eine ungerade Anzahl von Pixeln breit oder hoch ist, führt das Festlegen eines ganzzahligen Werts für die Position dazu, dass der Ursprung der Ansicht nicht ganzzahlig ist, was zu der Unschärfe führt, die Sie sehen.

Um dies zu umgehen, können Sie eine integrale Version Ihrer Position ermitteln, indem Sie die gewünschte Mittelposition der Ansicht nehmen, die Hälfte der Ansichtsbreite subtrahieren, diesen Wert runden, dann die Hälfte der Ansichtsbreite hinzufügen und wiederholen für die Höhe. Sie können auch anchorPoint für den Layer Ihrer Ansicht auf (0,0) setzen und die Ansicht basierend auf ihrem Ursprung positionieren.

Es besteht die Möglichkeit, dass dies auch auf eine Fehlausrichtung einer Superview zurückzuführen ist. Um dies zu diagnostizieren, können Sie das Core-Animationsinstrument in Instrumenten verwenden und die Option Falsche Farbbilder auswählen auswählen. Es sollte alle Ansichten oder Ebenen farblich ausleuchten, die in Ihrer Anwendung nicht pixelorientiert sind.

+1

Danke. Ja, das Problem war, dass einige meiner Bilder ein unebenes Pixel-Seitenverhältnis haben. Diejenigen, die gut funktionierten, hatten ein gleichmäßiges Verhältnis. Ändern des Ankerpunkts auf (0,0) funktioniert Auch die Anpassung der Bildgröße um ein Pixel in einem Bildeditor auf ein gleichmäßiges Verhältnis funktioniert (gut, wenn Sie sich nicht um den Pixel kümmern) I Ich werde jetzt das Kernanimationsinstrument versuchen. Danke für Ihre Hilfe. – Jonathan

+0

Ich habe versucht, die Option Color Misaligned und ja, wenn ich jemals eine "CAKeyFrameAnimation" tun, hillights die Ansicht von was auch immer animiert als "fehlausgerichtet". Aber die Start- und Stopppositionen sind in Ordnung. – Jonathan

2

Ich hatte eine ähnliche Erfahrung mit unscharfem Text in einem Etikett, und es wurde durch die Superansicht meiner Etiketten mit einem Subpixel-Offset verursacht. Obwohl die Position innerhalb dieser Ansicht integral war, hatte sie, wenn sie an die Koordinaten der Eltern angepasst wurde, einen halben Pixel oder so, der die Unschärfe verursachte.

Wenn Sie dies nur manchmal bekommen, könnte das nicht der Fall sein. Bewegt sich Ihre Superview oder ist sie seltsam positioniert? Ich würde sagen, dass es am besten ist, die genauen Umstände herauszufinden, unter denen dies geschieht.

1

IB hat einen Fehler, bei dem manchmal (nicht oft) nur bewegte Elemente sie unscharf machen - Sie sehen es am häufigsten mit UILabels und UIImageViews (obwohl das wahrscheinlich genau das ist, was am offensichtlichsten ist). Ich bin mir sicher, dass es mit den oben genannten Punkten in irgendeiner Weise zu tun hat, aber die Korrektur besteht häufig darin, die Koordinaten für den Standort (x, y) für das Element auf 0,0 und dann wieder auf die ursprünglichen Werte zu setzen. Dies behebt normalerweise das Problem (wieder ist dies in IB).

Verwandte Themen