Я рисую гистограммы, и у меня есть несколько многоуровневых CGR-элементов, которые находятся непосредственно друг над другом (т. Е. Один прямоугольник rectY является максимальным максимальным прямоугольником). Однако между прямыми все еще есть полупрозрачные промежутки. Есть ли способ исправить это? Я обнаружил, что это также происходит при рисовании, касающемся соседних дуг.Пиксельный зазор между CGRect
Вот скриншот того, что я имею в виду:
При масштабировании, я уже подтвердил, что это не просто оптический обман, как можно было бы найти между соседними красными и синими прямоугольниками. Буду признателен за любой вклад.
var upToNowSegmentTotal: CGFloat = 0
for k in 0..<data[i].bars[j].segments.count {
var segmentRect: CGRect = CGRect()
if barDirection == "vertical" {
let a: CGFloat = translateY(upToNowSegmentTotal)
let b: CGFloat = translateY(upToNowSegmentTotal + data[i].bars[j].segments[k].length)
upToNowSegmentTotal += data[i].bars[j].segments[k].length
var rectY: CGFloat
if a > b {
rectY = b
} else {
rectY = a
}
segmentRect = CGRect(
x: barWidthPosition,
y: rectY,
width: barWidthAbsolute,
height: abs(a - b)
)
}
}
Игнорировать материал о ширине баров. Вот функция translateY. В основном, он переводит координаты из окна графика в x/y, который нарисован. Помните, что из-за того, что область окна/графика не изменяется между выпрямленными прямоугольниками, тот же y-вход всегда будет давать одинаковый результат.
private func translateY(y: CGFloat) -> CGFloat {
if barsAreReversed {
return graphingArea.minY + graphingArea.height * (y - graphingWindow.startValue)/(graphingWindow.length)
} else {
return graphingArea.maxY - graphingArea.height * (y - graphingWindow.startValue)/(graphingWindow.length)
}
}
EDIT 2:
Вот упрощенная версия моего кода, который показывает проблему:
override func drawRect(rect: CGRect) {
let rect1: CGRect = CGRect(
x: 0,
y: 0,
width: 40,
height: 33.7
)
let rect2: CGRect = CGRect(
x: 0,
y: rect1.height,
width: 40,
height: 33.5
)
let context: CGContextRef = UIGraphicsGetCurrentContext()
CGContextSetFillColorWithColor(context, UIColor(red: 1/255, green: 29/255, blue: 29/255, alpha: 1).CGColor)
CGContextAddRect(context, rect1)
CGContextFillRect(context, rect1)
CGContextSetFillColorWithColor(context, UIColor(red: 9/255, green: 47/255, blue: 46/255, alpha: 1).CGColor)
CGContextAddRect(context, rect2)
CGContextFillRect(context, rect2)
}
Он производит это:
Это может быть полезно: http://stackoverflow.com/questions/9975219/cgrectintegral-what-is-the-usage-of -Это. –
Не может быть, что при 100% непрозрачности каждый CGRect полностью перезаписывает все, что находится под ним, даже если у него есть прозрачные части, которые должны быть смешаны? – DefinitelyNotAPlesiosaur
Код, вероятно, слишком много, чтобы показать, так как у меня есть куча сложных функций. Однако я добавлю наиболее важные детали. – DefinitelyNotAPlesiosaur