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

auf einem UIButton oder UITextField macht fein auf einem Retina-Bildschirm, sondern auf einem Nicht-Retina-Bildschirm nur die oberen und linken Ränder machen, während die rechten und untere Grenzen machen nicht.Warum werden Linien, die kleiner als 1,0 Punkte sind, auf Nicht-Retina-Bildschirmen nicht richtig dargestellt?

Ich nehme an, es hat etwas mit dpi des Bildschirms zu tun und wie Sub-Point-Linien gezeichnet werden, aber es ist möglich, dass es eine bessere Erklärung gibt.

Frage: Ich würde gerne wissen, ob es möglich ist, alle Seiten einer UIView ‚s Grenze Show zu haben, wie auch die Netzhaut und Nicht-Retina-Bildschirme mit borderWidth Set 0.5 erwartet.

+0

Auf Retina Hälfte 0,5 Punkte 1 Pixel. Eine 1-Pixel-Grenze ist ein vollkommen kohärentes und eindeutiges Konzept. Auf der Nicht-Retina dagegen sind 0,5 Punkte ein halbes Pixel. Welches Ergebnis würdest du vom Framework erwarten, um einen Halbpixelrand zu zeichnen? –

Antwort

9

Wenn Sie immer eine einzelne Pixelzeile (nicht Punkt) möchten, müssen Sie je nach Bildschirmgröße eine andere Rahmenbreite verwenden.

Z. B .:

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

das mag eine akzeptable Antwort sein, aber haben Sie eine Idee, was bewirkt, dass der Code in meiner Frage dazu führt, dass die rechten und unteren Grenzen nicht angezeigt oder möglicherweise abgeschnitten werden? – Brenden

+0

'CGFloat height = 1/[[UIScreen mainScreen] scale];' oder 'let height = 1/UIScreen.mainScreen(). Scale' für Swift 2.2 –

4

nun, dass mehrere Skalen unterstützt werden (@ 3x), ist es wahrscheinlich besser, Matts Antwort, da dies zu schreiben:

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

Ich schätze, du musst das 'f' Suffix entfernen, wenn du kompilierst mit 64 bit? Von was ich verstehe, ist CGFloat doppelt auf 64 Bit – kalehv

+0

@kalehv Yup, behoben Beispiel, keine Suffixe zu verwenden. –