Как мне что-то сделать после следующего NSView -layout?

В ответ на пользовательское событие я хочу:

  • добавить новый NSView в окно, а затем
  • показать NSPanel, расположенный чуть ниже этого представления

Я сделал каждую половину этого. Я могу добавить новое подпредставление, и представление контейнера -updateConstraints идентифицирует его и добавляет правильные ограничения макета, так что при следующем выполнении макета он будет правильно расположен в окне. Кроме того, у меня есть подкласс NSWindowController, который выводит панель на экран.

К сожалению, есть проблема с заказом. Контроллер моей панели просто смотрит на новое свойство NSView frame, чтобы решить, куда его поместить, но во время этой итерации основного цикла событий метод -layout еще не был вызван, поэтому он все еще находится в (0,0).

(Если я разделю эти две части функциональности и потребую два отдельных пользовательских события для «добавить представление» и «создать панель», тогда панель будет правильно расположена под представлением.)

Есть ли способ прикрепить NSPanel к NSView, как если бы с ограничением макета? Или есть способ сказать «сделай это (вещи оконного контроллера), но только после следующего вызова -layout»?


person user3277676    schedule 06.02.2014    source источник


Ответы (1)


Просто вызовите -layoutSubtreeIfNeeded в суперпредставлении вашего NSView, как только вы добавите его и его ограничения, чтобы он сразу же отобразился, а затем добавьте панель.

Или используйте NSPopOver, хотя они рисуют определенным образом, и вам это может не понадобиться.

person Wil Shipley    schedule 06.02.2014
comment
И да, я, должно быть, думал о методе – showRelativeToRect:ofView:preferredEdge: NSPopOver. Я использовал NSPopOver в прошлом, но в этом конкретном случае мне не нужен треугольник с речевым пузырем. - person user3277676; 06.02.2014