2013-02-26 24 views
6

To jest mój kod:CALayer: Pojedyncza linia pikseli wygląda 2 piksele

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]; 
} 

Rozumiem, że muszę przesuwać xiy 0,5 pikseli, czyli to, co zrobiłem, ale nadal pokazuje, jak linia 2 piksel zamiast 1.

enter image description here

+0

Należy pamiętać, że na urządzeniu Retina 1 punkt = 2 piksele. –

+0

@ H2CO3 - Nie jestem na siatkówce, ale warto o tym pamiętać. Jak można rozróżnić te dwa elementy? Czy jest stała? Myślałem, że może kakao zrobi wszystkie tłumaczenia automatycznie. Ale to kolejny temat. – Wesley

+0

Gdzie narysujesz linię? Widzę tylko prostokąt (layer.frame) z ustawioną szerokością na dziwną wartość 1. – AlexWien

Odpowiedz

2

Ustaw kadr warstwa jako

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

Tak to będzie działać na siatkówce również

Sprawdź to post Sekcja 1 Linie punkt i Pixel Granice .To jest dobrze wyjaśnione tam

+0

Dzięki za link! – Wesley

+0

Happy Coding :) –

+1

Nie podobało mi się wyjaśnienie w linku, więc stworzyłem ilustrację, która pokazuje zasadę. – nielsbot

19

poszedł do przodu i złożył obraz wyjaśniający, w przypadku jest to pomocne każdemu

enter image description here

dolna linia na dokładnym współrzędnych pikseli i będzie wyglądać rozmyte ... każda połowa szerokości linii leży w innym rzędzie pikseli ...

Górna linia jest przesunięta o line_width/2.0 i będzie wyglądać ostro ... leży całkowicie w rzędzie pikseli.

+1

Dziękuję za to potężne wyjaśnienie! – Wesley