Свифт: Н.С.Безье - PullRequest
       70

Свифт: Н.С.Безье

0 голосов
/ 14 декабря 2018

Это код внутри моего пользовательского класса представления:

func drawTestingPoint(_ point: CGPoint, target: Int, output: Int) {
    let path = NSBezierPath()
    path.appendArc(withCenter: point, radius: 5, startAngle: 0, endAngle: 360)
    NSColor.black.setStroke()
    if target == output {
        NSColor.green.setFill()
    } else {
        NSColor.red.setFill()
    }
    path.lineWidth = 3
    path.fill()
    path.stroke()
}

override func draw(_ dirtyRect: NSRect) {
    //If I call the drawTestingPoint function here it works
}

Внутри моего viewDidLoad метода в моем NSViewController классе я настраиваю пользовательское представление и пытаюсь нарисовать точку тестирования:

let size = getDataViewSize()
let origin = CGPoint(x: view.frame.width/2-size.width/2, y: view.frame.height/2-size.height/2)
dataView = DataView(frame: CGRect(origin: origin, size: size))
view.addSubview(dataView)
dataView.drawTestingPoint(CGPoint(x: view.frame.width/2 y: view.frame.height/2), target: target, output: output)
dataView.needsDisplay = true

Моя проблема в том, что ничто не притягивается.Я думаю, что не может быть ничего плохого в моей функции drawTestingPoint, потому что когда я вызываю ее внутри моей функции draw(_ dirtyRect: NSRect) в моем пользовательском классе NSView, она работает.Что я могу сделать, чтобы я мог вызывать эту функцию внутри моей viewDidLoad функции, как вы можете видеть в приведенных выше фрагментах кода, чтобы моя точка была нарисована

1 Ответ

0 голосов
/ 14 декабря 2018

Вы не можете просто рисовать в любое время.Обычно вы настраиваете представление и реализуете draw(_:), как сделали.Система вызывает метод draw, когда ему нужно представление, чтобы нарисовать его содержимое.Перед вызовом вашего метода draw(_:) он правильно настраивает контекст рисования, чтобы рисовать внутри вашего представления и обрезать, если вы рисуете вне представления.Это тот бит, который вам не хватает.

Как правило, вы НЕ должны рисовать вне метода представления draw(_:).Я делал рисование вне метода draw(_:) так редко, что не помню, что вам нужно сделать, чтобы правильно настроить контекст рисования.(Честно говоря, в настоящее время я занимаюсь в основном разработкой для iOS, а мой MacOS становится ржавым.)

Итак, короткий ответ: «Не делай этого».

РЕДАКТИРОВАТЬ:

Вместо этого настройте свой пользовательский вид, чтобы сохранить информацию, необходимую для рисования.Как и другие предлагали, когда вы вносите изменения в представление, установите needsDisplay=true в представлении.Это заставит систему вызывать метод представления draw(_:) при следующем прохождении цикла обработки событий

...