Неверный цвет и ширина линии с UIBezierPath

У меня возникли странные проблемы с UIBezierPath, где мой цвет и ширина линии не отображаются правильно.

Я рисую ряд строк (например, линейку) с основными и второстепенными градациями. Основными градациями являются линии с более длинной длиной …

Основные характеристики: Цвет Красный и Ширина линии: 2,0 Малая градация: Цвет Желтый и Ширина линии: 0.0 (тонкая линия согласно спецификации)

ползунок

override func draw(in ctx: CGContext) { if let _ = cameraControlSlider { guard gradationValues.count >= 0 else { return } let frame = CGRect(x: insetBy, y: 0, width: bounds.width - insetBy, height: bounds.height) ctx.clear(frame) let startx = Int(frame.origin.x) let endx = Int(frame.origin.x + frame.width) let incrementWidth = (endx - startx) / (gradationValuesOnScreen + 1) var counter = 1 var x = startx + counter * incrementWidth while x < endx { var y1 = Int(frame.origin.y) var y2 = Int(frame.origin.y) + Int(frame.height) var lineWidth: Float = 2.0 var color = UIColor.red if counter % majorGradationInterval != 1 { y1 = Int(frame.origin.y) + Int(frame.height / 4) y2 = Int(frame.origin.y + frame.height) - Int(frame.height / 4) lineWidth = 0.0 color = UIColor.yellow } ctx.addPath(drawLine(in: ctx, x1: x, y1: y1, x2: x, y2: y2, color: color, lineWidth: lineWidth)) counter += 1 x = startx + counter * incrementWidth } } } func drawLine(in ctx: CGContext, x1: Int, y1: Int, x2: Int, y2: Int, color: UIColor, lineWidth: Float) -> CGPath { let path = UIBezierPath() ctx.setStrokeColor(color.cgColor) path.lineWidth = CGFloat(lineWidth) path.move(to: CGPoint(x: x1, y: y1)) path.addLine(to: CGPoint(x: x2, y: y2)) path.close() ctx.strokePath() return path.cgPath } 

По сути, я хочу, чтобы более длинные линии были красного цвета и более толстой ширины линии, но цвета выглядели инвертированными, и ширина линии, по-видимому, не оказывала никакого влияния.

Как видно из функции рисования, нет красного цвета UIColor, который ассоциируется с меньшей длиной линии. Я попытался установить цвет удара до создания пути, но это, похоже, не работает.

One Solution collect form web for “Неверный цвет и ширина линии с UIBezierPath”

Здесь есть пара проблем, но ключевая проблема заключается в том, что drawLine создает UIBezierPath и вызывает strokePath . Но strokePath не UIBezierPath только что созданный UIBezierPath , а скорее предыдущий путь, добавленный в этот контекст. Но так как вы не добавляете строку в контекст до тех пор, пока не вернетесь из drawLine , все будет отключено на единицу. Кроме того, поскольку вы добавляете все эти строки в контекст (вместо замены пути), вы повторяете повторную перерисовку строк.

Вы можете исправить это, просто вызвав drawLine а не addPath(drawLine(...) :

 override func draw(in ctx: CGContext) { ... while x < endx { ... drawLine(in: ctx, x1: x, y1: y1, x2: x, y2: y2, color: color, lineWidth: lineWidth) ... } } 

И drawLine ничего не возвращает, но на самом деле просто рисует:

 func drawLine(in ctx: CGContext, x1: Int, y1: Int, x2: Int, y2: Int, color: UIColor, lineWidth: Float) { let path = UIBezierPath() ctx.saveGState() ctx.setStrokeColor(color.cgColor) ctx.setLineWidth(CGFloat(lineWidth)) path.move(to: CGPoint(x: x1, y: y1)) path.addLine(to: CGPoint(x: x2, y: y2)) ctx.addPath(path.cgPath) ctx.strokePath() ctx.restoreGState() } 

Обратите внимание: я сохраняю и восстанавливаю графический контекст, чтобы каждый раз рисовать новый сегмент линии линии. Кроме того, поскольку я поглаживаю путь контекста, я setLineWidth в контексте, а не в пути. Кроме того, не показано здесь, я обнаружил, что если я погладил желтые линии с шириной нуля, они не появлялись, поэтому я использовал 1:

Пример изображения

Обратите внимание, что если бы это был подкласс UIView вы могли бы упростить это дальше (просто UIBezierPath напрямую, а не войдя в CoreGraphics, вы можете сделать его @IBDesignable и т. Д.). Но если вы собираетесь реализовать draw(in:) , я бы, наверное, сделал что-то вроде выше.

  • Нарисуйте UIBezierPaths в UIView без подкласса?
  • Проблема с отслеживанием Multitouch
  • Только верхний левый угол округляется вместо topLeft и bottomLeft
  • Неизбежный механизм UIBezierPath для изгиба, контрольная точка и точка кривой
  • Получить очки от UIBezierPath
  • Как создать шаблон типа коллажа в ios
  • Вращение Безье в UIView
  • Как получить UIBezierPath из CGPoint или CGPath
  • Как нарисовать форму сердца в UIView (iOS)?
  • Рисование кривой Безье между множеством заданных точек
  • Применяет ли масштабное преобразование к CGPath влияние качества рендеринга?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.