2013-06-12 12 views
8
self.layer.borderWidth = 0.5; 

na UIButton lub UITextField renderować dobrze na ekranie siatkówki, ale na ekranie innym niż siatkówka renderowane są tylko górna i lewe krawędzie, natomiast prawe i dolne krawędzie nie są renderowane.Dlaczego linie mniejsze niż 1.0pt nie są poprawnie wyświetlane na ekranach innych niż siatkówka?

Zakładam, że ma to coś wspólnego z rozdzielczością ekranu i sposobem rysowania linii podpunktowych, ale możliwe jest, że istnieje lepsze wyjaśnienie.

Pytanie: Chciałbym wiedzieć, czy jest możliwe, aby wszystkie boki UIView „s granicznego pojawienia zgodnie z oczekiwaniami zarówno siatkówki i siatkówki non-ekranach z borderWidth zestaw do 0.5.

+0

Na siatkówce, pół 0,5 punktów to 1 piksel. Granica 1 piksel to doskonale spójna i jednoznaczna koncepcja. Z kolei na nie-siatkówce 0,5 punktu to pół piksela. Dokładnie jakiego rezultatu * oczekiwałbyś * od pytania o frameworkt, aby narysować półpikselową granicę? –

Odpowiedz

9

Jeśli chcesz zawsze wyświetlać pojedynczy piksel (nie punkt), musisz użyć innej szerokości ramki w zależności od skali ekranu.

Np .:

CGFloat scale = [[UIScreen mainScreen] scale]; 
if (scale == 2.0) { 
    // retina screen; 
    self.layer.borderWidth = 0.5; 
} else { 
    // non-retina screen 
    self.layer.borderWidth = 1.0; 
} 
+1

To może być akceptowalna odpowiedź, ale czy masz pojęcie, co powoduje, że kod w moim pytaniu powoduje, że prawe i dolne granice nie są wyświetlane lub mogą zostać obcięte? – Brenden

+0

'CGFloat height = 1/[skala [UIScreen mainScreen]]' lub 'niech wysokość = 1/UIScreen.mainScreen(). Scale' dla Swift 2.2 –

4

teraz, że wiele łuski są obsługiwane (@ 3x) to chyba lepiej napisać odpowiedź Matta jak to:

CGFloat scale = [[UIScreen mainScreen] scale]; 
CGFloat width = scale > 0.0 ? 1.0/scale : 1.0; 
[self.layer setBorderWidth:width]; 
+0

Domyślam się, że musisz usunąć ten sufiks" f ", jeśli kompilujesz z 64 bitami? Z tego co rozumiem, CGFloat jest podwójne w 64-bitowym kodzie – kalehv

+0

@kalehv Yup, poprawiono przykład, aby nie używać przyrostków. –

Powiązane problemy