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

Это сообщение: неверный контекст 0x0 в пользовательском UIView ... должен был дать мне ключ для решения моей проблемы, но я не смог избежать ошибки неверного контекста.Некоторое разъяснение будет высоко ценится.

Я хочу рисовать линии в подпредставлении, представленном при загрузке ViewController.Для этого я создаю подкласс для UIView, который похож на SplitCircleView, размещенный StartPlayer.

Чтобы запустить код, создайте новый проект и замените содержимое файла ViewController на:

import UIKit
@IBDesignable

class ViewController: UIViewController {
    let mySubViewInstance = SplitCircleView()

    override func viewDidLoad() {
        super.viewDidLoad()

        //let mySubViewInstance = SplitCircleView()
        mySubViewInstance.setNeedsDisplay(mySubViewInstance.frame)
    }
}

class SplitCircleView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        //self.setNeedsDisplay()
        //draw(frame)
    }

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

    override func setNeedsDisplay(_ rect: CGRect) {
        self.backgroundColor = .clear

        drawSlice(rect: rect, startPercent: 87.5, endPercent: 37.5, color: .green)
        drawSlice(rect: rect, 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()
    }
}

Как избежать ошибки недопустимого контекста и нарисовать что-то в подпредставлении, когдаViewController загружается?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Есть два места, которые нужно исправить.

Вы создаете новый вид, поэтому вам необходимо добавить к виду ваш viewController

 override func viewDidLoad() {
    super.viewDidLoad()

    let mySubViewInstance = SplitCircleView.init(frame: self.view.bounds)
    self.view.addSubview(mySubViewInstance)

  //  mySubViewInstance.setNeedsDisplay(mySubViewInstance.frame)
}

секунда - рисовать функцию, не используя setNeedsDisplay ();

override func draw(_ rect: CGRect) {

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

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

enter image description here

0 голосов
/ 13 сентября 2018

Вы должны переопределить draw, а не setNeedsDisplay.

override func draw(_ rect: CGRect) {
    self.backgroundColor = .clear

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

И настройку цвета фона необходимо выполнить только один раз, поэтому draw не совсем идеальное место для этой линии. Переместите его на init.

setNeedsDisplay указывает на необходимость обновления чертежа. Но именно draw делает фактический рисунок.

...