iPhone Core Graphics dickere gestrichelte Linie für Unteransicht

8

Ich habe ein UIView und darin habe ich eine Zeile mit Core Graphics gezeichnet, indem ich drawRect überschrieben habe. Diese Ansicht enthält auch eine Unteransicht, die ebenfalls eine Linie zeichnet. Obwohl beide Ansichten (zumindest zu Testzwecken) den gleichen Code verwenden, erscheinen die darauf gezeichneten Linien nicht gleich:

Wie Sie sehen können - die gestrichelte Linie oben ist merklich dicker als die untere und ich habe keine Ahnung warum. Unten ist der Code, den die beiden UIViews in ihren drawRect -Methoden verwenden. Wenn Sie eine Idee haben, warum das passiert, dann würde ich Ihre Hilfe und Ratschläge zu schätzen wissen!

Erste Ansicht:

%Vor%

Die Ansicht wird definitiv nur einmal gezeichnet. Ich schätze, dass drawRect möglicherweise nicht der beste Ort für das Hinzufügen einer Unteransicht ist, aber das Problem bleibt sogar bestehen, wenn es in der Methode initWithFrame hinzugefügt wird.

Zweite Ansicht:

%Vor%     
JoeR 19.11.2010, 22:15
quelle

2 Antworten

6

Es könnte ein Ergebnis von Anti-Aliasing sein, wenn Ihr rect nicht auf Ganzzahlen fällt. Sie können das Anti-Aliasing mit CGContextSetShouldAntialias( context, NO ) deaktivieren. Ich denke, es gibt auch eine Funktion, um ein reelles Integral zu machen, aber ich kann mich nicht erinnern, was es ist.

    
Brian 19.11.2010, 22:58
quelle
-2

Zuerst sollten Sie das Problem beheben, dass der Zeichencode WET * ist. Sie sagen, Sie machen das "zu Testzwecken", aber das macht das Testen tatsächlich schwieriger, da Sie beide Code-Teile ändern müssen und / oder gerade behalten müssen, an welcher Version Sie gerade arbeiten. Der schlimmste Fall ist, wenn Sie beide Teile des Codes auf verschiedene Arten ändern und sie von Hand zusammenführen müssen.

Ich würde sagen, den Code mit gestrichelter Linie in die Unteransicht verschieben, Eigenschaften für alles hinzufügen, was die zwei Teile des Codes anders machen müssen, und zwei Subviews erstellen (und nicht in drawRect: -seriously).

Was das eigentliche Problem anbetrifft: Nun, ich sehe kein großes Bild, ich sehe ein winziges Bild, und ich kann nur vermuten, dass die größere Kühnheit der oberen Linie als die der unteren Linie die obere Linie bedeutet ist dicker.

Übrigens ist rect nicht unbedingt die Grenze Ihres Bildes. Nimm niemals an, dass es so ist, oder du wirst unkonventionelles Zeichnen bekommen, wenn es nicht ist. Nimm an, dass es ein Teil der Grenzen ist - möglicherweise, aber möglicherweise nicht, die ganze Sache. Wenn Sie [self bounds] meinen, sagen Sie [self bounds] .

Das Problem ist wahrscheinlich der Unterschied zwischen CGRectGetMidY([self bounds]) und CGRectGetMaxY([self bounds]) . Einer enthält einen Bruchteil, der ein Pixel aufteilt, während der andere ein Vielfaches von einem Pixel oder nahe daran ist. (Nicht unbedingt ein Vielfaches von 1 - auf einem Retina Display, 1 pt = 2 Pixel, also 1 Pixel = 0,5 pt.) Versuchen Sie, beide Zahlen zu bemalen und optional 0,5 hinzuzufügen, und sehen Sie, welchen Weg Sie besser mögen.

Es gibt keine Möglichkeit, es mit einer Linienbreite von 0,6 pt perfekt zu machen. Es gibt einfach keine ganze Anzahl von Pixeln, die funktionieren. Alles, was Sie tun können, ist herauszufinden, was am besten aussieht und das tun.

* Auch anderswo geschrieben, das Gegenteil von DRY.

    
Peter Hosey 19.11.2010 23:19
quelle

Tags und Links