Изменения, внесенные в NSGraphicsContext.current - PullRequest
0 голосов
/ 13 февраля 2020

Я делаю изменения в текущем NSGraphicContext изнутри метода drawRect () NSView, и все работает нормально. Любые сделанные изменения сохраняются при последующих вызовах метода drawRect ().

Однако я хочу сделать изменения в текущем контексте из метода другого объекта. Этот метод действительно вызывается из метода DrawRect (). Но эти изменения не являются постоянными.

Код выглядит так:

class SomeView:NSView {

  override func drawRect(dirtyRect: NSRect) {
    // myAObject is an instance of a Class i create, and stored inside SomeView
    // myAObject's exexcuteCode() method, makes changes to the current NSGraphicsContext
    myAObjectIntance.executeCode() 

    // In subsequent calls of drawRect, as the user keeps drawing using the 
    // mouse, another object, say myBObject's executeCode() method, draws,
    // lets say a rectangle.
    myBObjectIntance.executeCode()

    // Problem is, that any changes done to the current context by myAObjectIntance.executeCode()
    // seem to be lost.

    // If i change the context and draw inside the same method call, everything is OK.
    // If changes and drawing are done by different objects, changes are lost.
  }
}

Из обоих методов, myAObjectIntance.executeCode () и myBObjectIntance.executeCode (), я получаю текущий NSGraphicsContext используя такой код:

NSGraphicsContext.current!.compositeOperation = .copy

или

NSGraphicsContext.current!.compositeOperation = .clear

Я добавил небольшой проект, который меняет цвет переднего плана. Изменение цвета не сохраняется между последовательными вызовами drawRect (). NSGraphicsContextTest.zip

1 Ответ

0 голосов
/ 18 февраля 2020

Проблема в том, что вы ожидаете, что ваш рисунок и изменения будут сохранены между несколькими вызовами drawRect; это не произойдет. Каждый раз, когда вызывается drawRect, состояние контекста сбрасывается. Это по замыслу. Таким образом, каждый раз, когда вызывается drawRect, вам нужно установить состояние контекста так, как вам нужно, и нарисовать, чтобы заполнить область, указанную параметром dirtyRect.

...