Swift/CoreGraphics: полукруглая дуга рисуется правильно, но положение/поворот указателя стрелки не соответствует значениIOS

Программируем под IOS
Ответить
Anonymous
 Swift/CoreGraphics: полукруглая дуга рисуется правильно, но положение/поворот указателя стрелки не соответствует значени

Сообщение Anonymous »

Я рисую полукруглый показатель ИМТ в формате PDF с помощью UIGraphicsPDFRenderer и UIBezierPath. Цветная дуга и метки отображаются правильно, но указатель стрелки (который должен указывать на положение дуги, соответствующее значению ИМТ) отображается в неправильном положении/стороне или с неправильным поворотом для ИМТ, который я передаю.
Я вставил полную функцию ниже. Дуга выглядит нормально, но когда я вызываю функциюgenerateBMIGaugePDF(bmi:someValue), стрелка не находится под правильным местоположением дуги (или не указывает точно на него) — она может быть смещена, зеркально отображена или неправильно повернута.
Что я делаю не так? Как мне рассчитать положение и вращение стрелки, чтобы стрелка всегда находилась под дугой в правильном радиальном положении и указывала на положение дуги, представляющее ИМТ?
Мою функцию можно найти ниже.

Код: Выделить всё

func generateBMIGaugePDF(
bmi: Double,
bmiMin: Double = 10,
bmiMax: Double = 40,
pageSize: CGSize = CGSize(width: 595, height: 842)
) -> URL? {
let clampedBMI = max(min(bmi, bmiMax), bmiMin)

let pdfMeta: [String: Any] = [
kCGPDFContextAuthor as String: "YourApp",
kCGPDFContextTitle as String: "BMI Gauge"
]
let format = UIGraphicsPDFRendererFormat()
format.documentInfo = pdfMeta
let renderer = UIGraphicsPDFRenderer(bounds: CGRect(origin: .zero, size: pageSize), format: format)
let filename = "bmi_gauge_\(Int(Date().timeIntervalSince1970)).pdf"
let tempURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename)

let margin: CGFloat = 40
let center = CGPoint(x: pageSize.width / 2, y: pageSize.height / 2 - 30)
let radius: CGFloat = min(pageSize.width - 2 * margin, pageSize.height / 2) / 2
let lineWidth: CGFloat = 28

// I draw the semicircle from right (0) to left (π)
let startAngle = CGFloat(0)
let endAngle = CGFloat.pi
let totalAngle = endAngle - startAngle

let segments = 3
let segmentAngle = totalAngle / CGFloat(segments)

let segmentColors: [UIColor] = [
UIColor(red: 1.00, green: 0.56, blue: 0.20, alpha: 1.0),
UIColor(red: 0.18, green: 0.86, blue: 0.40, alpha: 1.0),
UIColor(red: 0.18, green: 0.55, blue: 0.98, alpha: 1.0)
]

// angleForBMI - NOTE: I think this mapping may be related to the bug
func angleForBMI(_ v: Double) -> CGFloat {
let denom = bmiMax - bmiMin != 0 ? bmiMax - bmiMin : 1.0
let t = CGFloat((v - bmiMin) / denom) // normalized 0..1
// currently returning startAngle - t * totalAngle
return startAngle - t * totalAngle
}

do {
try renderer.writePDF(to: tempURL, withActions: { (context) in
context.beginPage()
let ctx = context.cgContext
ctx.saveGState()
ctx.setFillColor(UIColor.white.cgColor)
ctx.fill(CGRect(origin: .zero, size: pageSize))

// draw 3 colored arc segments
for i in 0..

Подробнее здесь: [url]https://stackoverflow.com/questions/79805778/swift-coregraphics-semicircular-arc-draws-correctly-but-arrow-pointer-positio[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»