Преобразование формы сгенерированного кода с помощью PaintCode в динамический размер фигуры

#swift #drawing #shapes #uibezierpath #paintcode

#быстрый #рисование #формы #uibezierpath #paintcode

Вопрос:

Я пытаюсь нарисовать фигуру, используя UIBezietPath, но каждый раз у меня возникают проблемы с «Кривой». Для решения моей проблемы я использовал код рисования, код был сгенерирован хорошо, но это статическая форма, и я пытаюсь перевести этот код для динамического размера экрана, но каждый раз у меня возникают проблемы с половиной формы.

Кто-нибудь может помочь мне правильно перевести этот код?

Сгенерированный код с помощью Paint Code:

 //// Color Declarations
let fillColor = NSColor(red: 0.118, green: 0.118, blue: 0.149, alpha: 1)

//// Bezier Drawing
let bezierPath = NSBezierPath()
bezierPath.move(to: NSPoint(x: 8.83, y: 89))
bezierPath.line(to: NSPoint(x: 154.29, y: 89))
bezierPath.curve(to: NSPoint(x: 163.01, y: 81.04), controlPoint1: NSPoint(x: 158.71, y: 89), controlPoint2: NSPoint(x: 162.21, y: 85.39))
bezierPath.curve(to: NSPoint(x: 206.45, y: 45.05), controlPoint1: NSPoint(x: 166.77, y: 60.57), controlPoint2: NSPoint(x: 184.79, y: 45.05))
bezierPath.curve(to: NSPoint(x: 249.89, y: 81.04), controlPoint1: NSPoint(x: 228.11, y: 45.05), controlPoint2: NSPoint(x: 246.12, y: 60.57))
bezierPath.curve(to: NSPoint(x: 258.61, y: 89), controlPoint1: NSPoint(x: 250.68, y: 85.39), controlPoint2: NSPoint(x: 254.19, y: 89))
bezierPath.line(to: NSPoint(x: 405.17, y: 89))
bezierPath.curve(to: NSPoint(x: 414, y: 80.21), controlPoint1: NSPoint(x: 410.05, y: 89), controlPoint2: NSPoint(x: 414, y: 85.06))
bezierPath.line(to: NSPoint(x: 414, y: 8.79))
bezierPath.curve(to: NSPoint(x: 405.17, y: 0), controlPoint1: NSPoint(x: 414, y: 3.94), controlPoint2: NSPoint(x: 410.05, y: 0))
bezierPath.line(to: NSPoint(x: 8.83, y: 0))
bezierPath.curve(to: NSPoint(x: 0, y: 8.79), controlPoint1: NSPoint(x: 3.95, y: 0), controlPoint2: NSPoint(x: 0, y: 3.94))
bezierPath.line(to: NSPoint(x: 0, y: 80.21))
bezierPath.curve(to: NSPoint(x: 8.83, y: 89), controlPoint1: NSPoint(x: 0, y: 85.06), controlPoint2: NSPoint(x: 3.95, y: 89))
bezierPath.close()
fillColor.setFill()
bezierPath.fill()
 

Форма:
введите описание изображения здесь

Ответ №1:

Сначала расширьте CGPoint и создайте scaled(by:) метод:

 extension CGPoint {
    func scaled(by value: CGFloat) -> CGPoint { applying(.init(scaleX: value, y: value)) }
}
 

Затем получите фактическую bounds ширину супервизора и разделите на ширину вашего пути 414 .

 let value: CGFloat = superview!.bounds.size.width / 414
 

Теперь вам просто нужно применить значение масштаба к каждой точке вашего пути:

 bezierPath.move(to: NSPoint(x: 8.83, y: 89).scaled(by: value))
 

Комментарии:

1. Отличный ответ! Этот код работает круто, я протестировал его на всех iPhone и iPad, работает хорошо. Но на iPad это нижнее меню кажется немного большим, что нужно изменить для устройств iPad? Я понимаю ваш код, но не понял, почему вы делите ширину стяжки на 414? Для устройств iPad это значение нужно изменить? Вы делите на 414, потому что max x позиция 414, я прав?

2. 414 — это наибольшее значение x в вашем пути (ширина экрана). Что касается вашей проблемы с iPad, я не уверен, но вам нужно будет выполнить отладку и узнать процентное значение, чтобы умножить масштаб, который вы используете сейчас.