2013-02-26 11 views
6

Dies ist mein Code:CALayer: Einzelpixelzeile sieht aus wie 2 Pixel

int columns 3; 
int columnWidth = self.layer.bounds.size.width/3; 

for (int c = 1; c < columns; c++) { 
    CALayer *layer = [CALayer layer]; 
    layer.frame = (CGRectMake(columnWidth * c + 0.5, 0.5, 1, self.layer.bounds.size.height)); 
    layer.backgroundColor = myColor; 
    [grid addSublayer:layer]; 
} 

Ich verstehe, dass ich die x und y 0,5 Pixel zu verschieben, was ist das, was ich getan habe, aber es zeigt immer noch als 2 eine Pixelzeile anstelle von 1.

enter image description here

+0

Beachten Sie, dass bei einem Retina-Gerät 1 Punkt = 2 Pixel ist. –

+0

@ H2CO3 - Ich bin nicht auf Retina, aber es ist gut, daran zu denken. Wie würde man zwischen den beiden unterscheiden? Gibt es eine Konstante? Ich dachte, Kakao würde alle Übersetzungen automatisch machen. Aber das ist ein anderes Thema. – Wesley

+0

Wo zeichnest du die Linie? Ich sehe nur ein Rechteck (layer.frame) mit einer auf den seltsamen Wert 1 eingestellten Breite. – AlexWien

Antwort

2

Stellen die Schicht-Rahmen als

layer.frame = (CGRectMake(columnWidth * c + 0.5, 0.5, 0.5, self.layer.bounds.size.height)); 

Ja, es wird für Retina arbeiten auch

prüfen diese post Abschnitt 1 Punkt Linien und Pixel-Grenzen .Es gut erklärt es

+0

Danke für den Link auch! – Wesley

+0

Happy Coding :) –

+1

Ich mochte die Erklärung in der Verbindung nicht, also schuf ich eine Illustration, die das Prinzip zeigt. – nielsbot

19

Ich ging voran und machte ein erläuterndes Bild, falls es hilfreich ist jedem

enter image description here

die untere Linie auf genaue Pixelkoordinaten und verschwommen aussieht ... jede Hälfte der Breite der Linie liegt, in einer anderen Zeile von Pixeln ...

Die obere Zeile wird um line_width/2.0 versetzt und sieht scharf aus ... sie liegt komplett innerhalb einer Pixelzeile.

+1

Vielen Dank für diese aussagekräftige Erklärung! – Wesley