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()
}
Какая часть вы думаете, что «должен» сделать эти строки желтыми? Я вижу два места, где используется 'yellowColor()': для инициализации 'fieldColor' и' edgeColor'. Первый используется только для присвоенного цвета переднего плана, а последний используется только для штриха «солнца». Вы не устанавливаете (ход) цвет перед тем, как рисовать радиальные линии. –
Я добавил 'CGContextSetStrokeColorWithColor (контекст, UIColor.yellowColor(). CGColor)' непосредственно перед 'CGContextSaveGState (context)' и теперь он работает. Благодарю. По-видимому, вам нужно установить ход до сохранения состояния. –
Вам не нужно устанавливать цвет такта перед сохранением состояния. Вам просто нужно сделать это, прежде чем погладить линию (или путь). Фактически, вы должны, вероятно, сделать это между сохранением и восстановлением состояния, чтобы оно влияло только на то, что вы намереваетесь сделать. –