неверный контекст 0x0 в пользовательском UIView - PullRequest
0 голосов
/ 01 июня 2018

У меня есть следующий код для пользовательского вида.

@IBDesignable class SplitCircleView: UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        draw(frame)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        draw(frame)
    }

    override func draw(_ rect: CGRect) {

        self.backgroundColor = .clear

        drawSlice(rect: self.frame, startPercent: 87.5, endPercent: 37.5, color: .green)
        drawSlice(rect: self.frame, startPercent: 37.5, endPercent: 87.5, color: .red)
    }

    func drawSlice(rect: CGRect, startPercent: CGFloat, endPercent: CGFloat, color: UIColor) {

        let center = CGPoint(x: rect.origin.x + rect.width / 2, y: rect.origin.y + rect.height / 2)
        let radius = (min(rect.width, rect.height) / 2)
        let startAngle = startPercent / 100 * .pi * 2 - .pi
        let endAngle = endPercent / 100 * .pi * 2 - .pi
        let path = UIBezierPath()

        path.move(to: center)
        path.addArc(withCenter: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)
        path.close()
        color.setFill()

        path.fill()
    }
}

Я пытаюсь нарисовать круг с двумя полукругами разных цветов.

Это выглядит хорошо, когда я его просматриваюна детской площадке живой вид.Когда я ставлю это приложение, это вызывает у меня проблемы.Когда код пытается выполнить color.setFill () и path.fill (), в журнале появляются следующие ошибки:

2018-06-01 14: 37: 08.118005 + 0100 SplitCircleView [21353: 2290599] [Неизвестное имя процесса] CGContextSetFillColorWithColor: недопустимый контекст 0x0.Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE.2018-06-01 14: 37: 08.118055 + 0100 SplitCircleView [21353: 2290599] [Неизвестное имя процесса] CGContextSaveGState: недопустимый контекст 0x0.Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE.2018-06-01 14: 37: 08.118094 + 0100 SplitCircleView [21353: 2290599] [Неизвестное имя процесса] CGContextSetFlatness: недопустимый контекст 0x0.Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE.2018-06-01 14: 37: 08.118141 + 0100 SplitCircleView [21353: 2290599] [Неизвестное имя процесса] CGContextAddPath: недопустимый контекст 0x0.Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE.2018-06-01 14: 37: 08.118184 + 0100 SplitCircleView [21353: 2290599] [Неизвестное имя процесса] CGContextDrawPath: недопустимый контекст 0x0.Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE.2018-06-01 14: 37: 08.118222 + 0100 SplitCircleView [21353: 2290599] [Неизвестное имя процесса] CGContextRestoreGState: недопустимый контекст 0x0.Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE.2018-06-01 14: 37: 08.118336 + 0100 SplitCircleView [21353: 2290599] [Неизвестное имя процесса] CGContextSetFillColorWithColor: недопустимый контекст 0x0.Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE.2018-06-01 14: 37: 08.118376 + 0100 SplitCircleView [21353: 2290599] [Неизвестное имя процесса] CGContextSaveGState: недопустимый контекст 0x0.Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE.2018-06-01 14: 37: 08.118413 + 0100 SplitCircleView [21353: 2290599] [Неизвестное имя процесса] CGContextSetFlatness: недопустимый контекст 0x0.Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE.2018-06-01 14: 37: 08.118451 + 0100 SplitCircleView [21353: 2290599] [Неизвестное имя процесса] CGContextAddPath: недопустимый контекст 0x0.Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE.2018-06-01 14: 37: 08.118491 + 0100 SplitCircleView [21353: 2290599] [Неизвестное имя процесса] CGContextDrawPath: недопустимый контекст 0x0.Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE.2018-06-01 14: 37: 08.118528 + 0100 SplitCircleView [21353: 2290599] [Неизвестное имя процесса] CGContextRestoreGState: недопустимый контекст 0x0.Если вы хотите увидеть обратную трассировку, установите переменную среды CG_CONTEXT_SHOW_BACKTRACE.

Что я делаю не так и как я могу это исправить?

1 Ответ

0 голосов
/ 01 июня 2018

В документации по функции draw(_ rect: CGRect).(Последний абзац «Обсуждение».)

Никогда не вызывайте этот метод самостоятельно.

Если вы хотите вызвать эту функцию, вам следует использовать ...

self.setNeedsDisplay()

Документация для функции draw.

Однако

Как указал @vacawama (и япропущено) функция draw будет вызываться после добавления вашего представления в иерархию представлений в любом случае.Так что вам не нужно вообще это называть здесь.Это произойдет автоматически для вас.

Так что внутри методов init просто удалите вызов полностью.

Место для его повторного вызова, например, если представление меняет форму или если выхочу изменить его содержимое.то есть цвет или что-то.

...