На NSWindowController установка contentViewController обновляет позицию окна, как я могу остановить это? - PullRequest
0 голосов
/ 03 января 2019

У меня есть NSWindowController с NSWindow, у меня возникла проблема, когда, если я установлю contentViewController контроллера, кадр NSWindow обновится выше моих ожиданий

  1. Окно в начале координат, скажем, (500 500), а его размер (100 100)
  2. Я перетаскиваю его на (300 300)
  3. Я нажимаю элемент управления, который обновляет contentViewController
  4. Размер остается на (100,100), но источник возвращается к (500, 500)

Все окно остается того же размера, но оно просто возвращается к исходной позиции

Это код, который обновляет фрейм

self.contentViewController = loadingViewController

Я подтвердил это, распечатав фрейм окна в lldb, до и после этой строки:

▿ Optional<CGRect>
  ▿ some : (-1701.0, 439.0, 1042.0, 778.0)
    ▿ origin : (-1701.0, 439.0)
      - x : -1701.0
      - y : 439.0
    ▿ size : (1042.0, 778.0)
      - width : 1042.0
      - height : 778.0

(lldb) po self.window?.frame
▿ Optional<CGRect>
  ▿ some : (-1680.0, 416.0, 800.0, 778.0)
    ▿ origin : (-1680.0, 416.0)
      - x : -1680.0
      - y : 416.0
    ▿ size : (1042.0, 778.0)
      - width : 1042.0
      - height : 778.0

Что дажеболее загадочным является то, что я изначально пробовал 3 отдельных места, чтобы поймать окно, перемещающееся, чтобы найти строку кода, вызывающую его

Я зарегистрировался в качестве наблюдателя:

NotificationCenter.default.addObserver(self, selector: #selector(windowMoved(notification:)), name: NSWindow.didMoveNotification, object: nil)

, а также установил символическоеточки останова на:

- [NSWindow _windowMoved:] и - [NSWindow _setFrame:]

Все 3 из этих методов улавливали движение окна, когда я вручную перетаскивал окно.

Однако ни один из 3 не уловил движение окна, когда кадр был программно изменен из этой одной строки кода.выше ^^

Кто-нибудь видел это раньше или имеет представление о том, как это может быть?

1 Ответ

0 голосов
/ 04 января 2019

Оказалось слишком много усилий, чтобы изолировать эту проблему в тестовом проекте, поэтому я решил просто вставить патч,

Я просто сохраняю источник перед установкой contentViewController и сбрасываю егопосле этого.Это работает для меня, хотя я все еще не уверен, почему это происходит

    let originalFrameOrigin = self.window?.frame.origin ?? CGPoint(x: 100, y: 100)
    self.contentViewController = loadingViewController
    self.window?.setFrameOrigin(originalFrameOrigin)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...