2015-05-07 2 views
0

Следующий код имеет проблему, по какой-то причине радиальные линии втягиваются черным, когда они должны быть сделаны в UIColor.yellowColor()Отладочный код :: Как окрашивать строки в CGContext?

import UIKit 
import QuartzCore 


let π:CGFloat = CGFloat(M_PI) 

class CircularPlotView:UIView { 

    var lineWidth:CGFloat = 1.5 { didSet { setNeedsDisplay() } } 
    var edgeColor:UIColor = UIColor.yellowColor() { didSet { setNeedsDisplay() } } 
    var fillColor:UIColor = UIColor.orangeColor() { didSet { setNeedsDisplay() } } 
    var fieldColor:UIColor = UIColor.yellowColor(){ didSet { setNeedsDisplay() } } 
    var lineColor:UIColor = UIColor.blueColor(){ didSet { setNeedsDisplay() } } 
    var scale: CGFloat = 0.90 { didSet { setNeedsDisplay() } } 
    //var plotCenter:CGPoint { return convertPoint(center, fromView: superview) } 
    var plotCenter:CGPoint {return CGPoint(x: 190,y: 316) } 
    var plotRadius:CGFloat {return min(bounds.size.width, bounds.size.height)/8 * scale } 
    var diameterX:CGFloat = 100.0 
    var radiusX:CGFloat {return diameterX * 0.5} 
    var scaleFactorDB:CGFloat = 5.0 
    var offsetDB:CGFloat = 0.0 

    //data to plot 
    var dataString:[String] = ["cat","dog","pizza"] 
    var dataDB:[Float] = [11.0,9.0,3.5] 

    var fontSize:CGFloat = 17.0 

    override func drawRect(rect: CGRect) { 

    let context = UIGraphicsGetCurrentContext() 

    let fieldFont = UIFont.systemFontOfSize(fontSize) 

    let paragraphStyle:NSMutableParagraphStyle = NSMutableParagraphStyle.alloc() 
    paragraphStyle.lineHeightMultiple = 1 
    paragraphStyle.lineBreakMode = NSLineBreakMode.ByWordWrapping 

    let attributes:Dictionary = [ 
     NSParagraphStyleAttributeName : paragraphStyle, 
     NSForegroundColorAttributeName: fieldColor, 
     NSFontAttributeName: fieldFont 
    ] 


    var theta:CGFloat = 1.5 * π //CGFloat(M_PI) 
    var radius:CGFloat = 0.0 
    //var s:NSString = "ERROR FIX DATABASE" //if shown error in DB 

    let startTime = CFAbsoluteTimeGetCurrent() 

    //MARK:== draw strings == 
    //with enough separation so they don't clobber each other 
    var myAttributedString:NSMutableAttributedString! 

    for (var i=0; i < dataDB.count; i++) 
    { 
     //s = NSString(string: dataString[i]) 
     myAttributedString = NSMutableAttributedString (string: dataString[i], attributes:attributes) 

     theta = 1.97 * π * (CGFloat(i)/(CGFloat(dataDB.count))) 
     radius = (radiusX + 10.0 + offsetDB + scaleFactorDB*CGFloat(dataDB.reduce(dataDB[0], { max($0, $1) }))) 

     CGContextSaveGState(context) 
     CGContextTranslateCTM(context,plotCenter.x ,plotCenter.y) 
     CGContextRotateCTM(context, theta) 
    CGContextSetStrokeColorWithColor(context,UIColor.yellowColor().CGColor) 
     CGContextMoveToPoint(context,0.0,0.0) 
     CGContextAddLineToPoint(context, radiusX + scaleFactorDB*CGFloat(dataDB[i]) + offsetDB, 0.0) 
     myAttributedString.drawAtPoint(CGPoint(x: radius , y: 0)) 
     CGContextRestoreGState(context) 
    } 

    let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime 
    println("Time elapsed loop through lines and strings: \(timeElapsed) s") 

    CGContextStrokePath(context) 

    //MARK:== draw oval, fill, edge == 
    let sunPath = UIBezierPath(ovalInRect: CGRectMake(
     plotCenter.x - radiusX, 
     plotCenter.y - radiusX, 
     diameterX, diameterX) 
    ) 

    sunPath.lineWidth = lineWidth 

    edgeColor.set() 
    sunPath.stroke() 

    fillColor.setFill() 
    sunPath.fill() 

    } 
+1

Какая часть вы думаете, что «должен» сделать эти строки желтыми? Я вижу два места, где используется 'yellowColor()': для инициализации 'fieldColor' и' edgeColor'. Первый используется только для присвоенного цвета переднего плана, а последний используется только для штриха «солнца». Вы не устанавливаете (ход) цвет перед тем, как рисовать радиальные линии. –

+0

Я добавил 'CGContextSetStrokeColorWithColor (контекст, UIColor.yellowColor(). CGColor)' непосредственно перед 'CGContextSaveGState (context)' и теперь он работает. Благодарю. По-видимому, вам нужно установить ход до сохранения состояния. –

+0

Вам не нужно устанавливать цвет такта перед сохранением состояния. Вам просто нужно сделать это, прежде чем погладить линию (или путь). Фактически, вы должны, вероятно, сделать это между сохранением и восстановлением состояния, чтобы оно влияло только на то, что вы намереваетесь сделать. –

ответ

0

Был

CGContextSaveGState(context) 
    CGContextTranslateCTM(context,plotCenter.x ,plotCenter.y) 
    CGContextRotateCTM(context, theta) 
    CGContextMoveToPoint(context,0.0,0.0) 
    CGContextAddLineToPoint(context, radiusX + scaleFactorDB*CGFloat(dataDB[i]) + offsetDB, 0.0) 
    myAttributedString.drawAtPoint(CGPoint(x: radius , y: 0)) 
    CGContextRestoreGState(context) 

исправленный

CGContextSaveGState(context) 
    CGContextTranslateCTM(context,plotCenter.x ,plotCenter.y) 
    CGContextRotateCTM(context, theta) 
    CGContextSetStrokeColorWithColor(context,lineColor.CGColor) 
    CGContextMoveToPoint(context,0.0,0.0) 
    CGContextAddLineToPoint(context, radiusX + scaleFactorDB*CGFloat(dataDB[i]) + offsetDB, 0.0) 
    CGContextStrokePath(context) 
    myAttributedString.drawAtPoint(CGPoint(x: radius , y: 0)) 
    CGContextRestoreGState(context) 
Смежные вопросы