2016-07-07 14 views
0

Ich erstelle eine Trichterform mit CGContext, indem ich zuerst ein Dreieck zeichne, gefolgt von einer Linie. Ich implementiere das in drawRect meiner Unterklasse UIView, aber frage mich, ob es eine alternative Möglichkeit gibt, dies zu zeichnen, weil die Linien ein wenig verschwommen sind.Gibt es eine bessere Alternative zu CGContext?

override func drawRect(rect: CGRect) { 

     let context: CGContextRef = UIGraphicsGetCurrentContext()! 
     CGContextClearRect(context, rect); 

     let rectWidth: CGFloat = 15 

     // Line 
     CGContextSetRGBStrokeColor(context, 0, 0, 0, 1) 
     CGContextMoveToPoint(context, rectWidth/2, 5) 
     CGContextAddLineToPoint(context, rectWidth/2, 10) 
     CGContextSetStrokeColorWithColor(context, UIColor.blueColor().CGColor) 
     CGContextSetLineCap(context, CGLineCap.Round) 
     CGContextSetLineWidth(context, 3.0) 
     CGContextStrokePath(context) 

     // Triangle 
     CGContextBeginPath(context); 
     CGContextMoveToPoint (context, CGRectGetMinX(rect), CGRectGetMinY(rect)); 
     CGContextAddLineToPoint(context, CGRectGetMidX(rect), 8); 
     CGContextAddLineToPoint(context, CGRectGetMaxX(rect), CGRectGetMinY(rect)); 
     CGContextClosePath(context); 

     UIColor.blueColor().setFill() 
     CGContextFillPath(context); 

    } 

Dies erzeugt: enter image description here

Aber wenn ich ein Bild importieren, die ich entworfen, das Bild ist knackiger (Sie auf einem iPhone sagen kann): enter image description here

So gibt es eine bessere Möglichkeit, dieses Ergebnis zu erreichen? Die CGContext Zeilen sind ein wenig verschwommen, so würde ich gerne wissen, ob es eine bessere Alternative gibt und was die Vor- und Nachteile dieser Methoden sind.

+0

Ich sehe beide Bilder gleichermaßen verschwommen. – Tricertops

Antwort

2

Core Graphics zeichnet Dinge verschwommen, wahrscheinlich, weil Sie es gesagt haben. Die Position jedes Paars ganzzahliger Koordinaten im CG-Koordinatensystem befindet sich genau auf den Gitterlinien. Wenn Sie einen Punkt breiten Strich zwischen diesen Koordinaten zeichnen, erhalten Sie einen Strich, der die Gitterlinie auf jeder Seite um einen halben Punkt überspannt. Abhängig von der Skalierung des Bitmapkontexts, in den Sie zeichnen, kann dies zu zwei Spalten mit halbschattierten Pixeln statt einer Spalte mit vollständig schattierten Pixeln führen - also zu einer unscharfen Linie.

In diesem Fall fallen einige der Punkte, auf die Sie Linien zeichnen, auf Ganzpixelgrenzen und einige auf Halbpixelgrenzen. Bei 1x-Anzeigen werden einige der Linien unscharf und bei 2x oder 3x anderen angezeigt wird sein. Lesen Sie in Apples Dokumentation über Zeichnung über Points versus Pixels, und Sie werden wahrscheinlich eine Möglichkeit finden, Ihre Koordinaten zu versetzen, so dass die Linien alle dort fallen, wo Sie sie haben wollen.

Verwandte Themen