Неверный цвет и ширина линии с 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:) , я бы, наверное, сделал что-то вроде выше.

  • Нарисуйте круговую диаграмму с UIBezierPath
  • Пользовательская рамка кнопки выглядит не так хорошо, как Round Rect UIButton
  • Анимация UIBezierPath, которая зажимает UIImage
  • UIBezierPath addClip и drawRect
  • Анимация точки кривой Безье
  • iOS - объединение обрезки двух путей с использованием UIBezierPath appendPath
  • Получить очки от UIBezierPath
  • Как изменить цвет элемента с помощью UIBezierPath?
  • Размытый снимок экрана, отображаемый UIBezierPath
  • Нарисуйте путь с переменной шириной в iOS
  • получать точки на эллипсе CGRect с фиксированными интервалами в базовой графике ios
  • Interesting Posts

    Ошибка Xcode при попытке построить проект React Native на симуляторе или устройстве

    Идентификатор рекламы и идентификаторForVendor возвращают «00000000-0000-0000-0000-000000000000»,

    Ошибка iPhone при синхронизации NSUserDefaults: CFPreferences Background Sync Queue

    Инициатива IOS 9 UIButton

    Как обнаружить запрос проверки подлинности из UIWebView?

    Отладка параллелизма основных данных – exc_bad_instruction

    Метод swizzling API iOS для частной инфраструктуры

    Создайте миниатюру из UIViewController без отображения

    Как отображать эможи и специальные символы в UIlabel и UItextviews?

    Как создать проект iOS с открытым исходным кодом?

    Синхронизация по времени для приложения iOS

    Расширение общего доступа только с определенным URL-адресом

    Могу ли я использовать расширение класса .h и .m для iOS и OSX?

    SecPKCS12Import, когда p12 требует пустую кодовую фразу

    Помогите понять метод класса, возвращающий singleton

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.