отметки ниже оси X (iOS-графики) - PullRequest
0 голосов
/ 28 июня 2018

Я хочу сделать отметки ниже оси X, на которой расположены метки даты (3.6., 7.6., 12.6. 17.6, 21.6., 26.6.) (См. Изображение ниже). Я использую библиотеку iOS Charts (https://github.com/danielgindi/Charts).

Мне удалось сделать отметки внутри графика, переопределив метод drawGridLine. Все, что я сделал, это изменил начало отрезка с viewPortHandler.contentTop на viewPortHandler.contentBottom - 5. То есть линия сетки начинается на 5 пикселей выше оси X. Однако при расширении линии сетки за ось х (viewPortHandler.contentBottom + 10), линия все равно будет оттягиваться только до оси х, но не ниже. Может ли кто-нибудь указать мне правильное направление? Как нарисовать вертикальные линии ниже оси X?

Вот мой пользовательский XAxisRenderer:

class XAxisRendererWithTicks: XAxisRenderer {

    override func drawGridLine(context: CGContext, x: CGFloat, y: CGFloat) {
        guard
            let viewPortHandler = self.viewPortHandler
            else { return }

        if x >= viewPortHandler.offsetLeft
            && x <= viewPortHandler.chartWidth
        {
            context.beginPath()
            context.move(to: CGPoint(x: x, y: viewPortHandler.contentBottom - 5))
            context.addLine(to: CGPoint(x: x, y: viewPortHandler.contentBottom + 10))
            context.strokePath()
        }
    }
}

Галочки появляются, но я хочу, чтобы они были ниже ось x:

enter image description here

Здесь есть похожий вопрос, но его ответы мне не очень помогли: Вертикальные линии на iOS-диаграммах X Axis

1 Ответ

0 голосов
/ 15 апреля 2019

Я думаю, drawGridLine не подходит для этого, потому что вы не можете рисовать ниже оси X.

Мне удалось нарисовать тики ниже оси x, переопределив drawLabel. Эта функция рисует метки ниже оси x и поэтому может рисовать там что-то еще. Например, наши желаемые тики!

class XAxisRendererWithTicks: XAxisRenderer {

     override func drawLabel(context: CGContext, formattedLabel: String, x: CGFloat, y: CGFloat, attributes: [NSAttributedString.Key: Any], constrainedToSize: CGSize, anchor: CGPoint, angleRadians: CGFloat) {

         super.drawLabel(context: context, formattedLabel: formattedLabel, x: x, y: y, attributes: attributes, constrainedToSize: constrainedToSize, anchor: anchor, angleRadians: angleRadians)

         context.beginPath()

        context.move(to: CGPoint(x: x, y: y))
        context.addLine(to: CGPoint(x: x, y: self.viewPortHandler.contentBottom))

        context.strokePath()
     }
}

Чтобы использовать пользовательский рендер:

let customXAxisRenderer = XAxisRendererWithTicks(viewPortHandler: self.chartView.viewPortHandler, xAxis: xAxis, transformer: self.chartView.getTransformer(forAxis: .left))

self.chartView.xAxisRenderer = customXAxisRenderer

Пример изображения: Пожалуйста, не обращайте внимания на цвета, но я думаю, вы понимаете, о чем я. ;)

enter image description here

Надеюсь, это поможет!

...