2016-07-07 4 views
0

Я создаю форму воронки, используя CGContext, сначала рисуя треугольник, а затем линию. Я реализую это в drawRect моего подкласса UIView, но задаюсь вопросом, есть ли альтернативный способ его рисования, потому что строки немного размыты.Есть ли лучшая альтернатива 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); 

    } 

Производит это: enter image description here

Но когда я импортировать изображение, которое я разработал, изображение четче (вы можете сказать на iPhone): enter image description here

Итак, есть лучший способ достичь этого результата? Линии CGContext немного размыты, поэтому я хотел бы знать, есть ли более эффективная альтернатива и каковы плюсы и минусы этих методов.

+0

Я вижу оба изображения одинаково размытыми. – Tricertops

ответ

2

Основная графика рисует что-то размытое, вероятно, потому, что вы сказали это. Расположение каждой пары целочисленных координат в системе координат CG находится точно на линиях сетки - если вы рисуете один тактный широкоугольный ход между такими координатами, вы получаете штрих, который пересекает линию сетки на половину точки с обеих сторон. В зависимости от масштаба контекста битмапа, который вы рисуете, это может привести к получению двух столбцов полузатененных пикселей вместо одного столбца полностью затененных пикселей, т. Е. Размытой линии.

В вашем случае некоторые из точек, которые вы рисуете между линиями, попадаете на границы всех пикселей, а некоторые - на границы полупикселей, поэтому на 1x отобразится, что некоторые из линий будут размытыми, а на 2x или 3x отобразятся другие будет. Читайте о Points versus Pixels в документах Apple на рисунке, и вы, вероятно, найдете способ компенсировать ваши координаты, которые заставляют все линии падать туда, где вы хотите.

Смежные вопросы