2016-10-27 4 views
0

Ich versuche ein Programm zu schreiben, das eine Kurve zeichnet. Je kürzer die Kurve, desto näher an Grün wird es. Hier ist der Code zum Zeichnen des Kreises:swift - Fehler beim Zeichnen der Kurve

func drawCircle(percent: CGFloat) { 
    // Set up all the data for the circle 
    let redAmt = 1/100 * percent 
    let greenAmt = 1 - redAmt 
    let circleColor = UIColor.init(red: redAmt, green: greenAmt, blue: 0, alpha: 1) 
    let lineWidth = CGFloat(12) 
    let centerX = self.frame.size.width/2 
    let centerY = self.frame.size.height/2 
    let radius = (self.frame.size.width - lineWidth)/2 
    // Clear the area where the circle is going to be drawn 
    let clearCirclePath = UIBezierPath(arcCenter: CGPoint(x: centerX, y: centerY), radius: radius, startAngle: CGFloat(0), endAngle: CGFloat(M_PI * 2), clockwise: true) 
    clearColor.setStroke() 
    clearCirclePath.lineWidth = lineWidth 
    clearCirclePath.stroke() 
    // Draw the circle 
    let circlePath = UIBezierPath(arcCenter: CGPoint(x: centerX, y: centerY), radius: radius, startAngle: CGFloat(0), endAngle: CGFloat(M_PI * 2) * percent/100, clockwise: true) 
    circleColor.setStroke() 
    circlePath.lineWidth = lineWidth 
    circlePath.stroke() 
} 

Es funktioniert gut, wenn sie von drawRect(rect: CGRect) genannt, aber wenn ich versuche, in einer anderen Datei zu nennen, es funktioniert nicht. Es zeichnet den Lichtbogen in einer Ansicht innerhalb eines View-Controllers. Der Fehler, den es mir gibt, ist dies: ExerciseTracker[7270] <Error>: CGContextSetStrokeColorWithColor: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.

Vielen Dank!

(Ich verwende Xcode 7.3.1)

Antwort

2

Sie in einem gültigen Kontext ziehen müssen. drawRect: bietet einen solchen gültigen Kontext. Das einfache Einfügen von Code außerhalb von drawRect: funktioniert nicht, es sei denn, Sie erstellen explizit einen eigenen Kontext, z. B. einen Bitmap-Kontext, um ein Bild durch Zeichnen zu erstellen. Der Code in Ihrer drawCircle-Methode muss in der drawRect:-Methode einer benutzerdefinierten Ansichtsklasse enthalten sein. Anstatt percent als Parameter zu übergeben, legen Sie sie als Instanzvariable fest. Wenn Sie dann den Wert percent aktualisieren, rufen Sie setNeedsDisplay() auf, um die Ansicht neu zu zeichnen.

Verwandte Themen