Как анимировать изменение размера NSViewController, представленного в виде листа?

В Xcode, если вы попытаетесь создать новый файл, он спросит вас, где его сохранить. Есть эта кнопка, которую вы можете нажать, чтобы развернуть представленный лист:

введите здесь описание изображения

Я пытаюсь создать что-то похожее на эту кнопку, которая увеличит NSViewController, представленную с переходом на лист. Обратите внимание, что я не пытаюсь создать свою собственную версию NSSavePanel. Я просто пытаюсь использовать это в качестве примера, чтобы проиллюстрировать поведение кнопки, которую я хочу создать.

Я знаю, что могу установить preferredContentSize на что-то большее, чтобы увеличить лист:

preferredContentSize = CGSize(width: 300, height: 300)

Но это сразу меняет размер, в отличие от кнопки в диалоге сохранения файла, которая показывает анимацию увеличения листа.

Я попытался поместить его в блок анимации:

NSAnimationContext.runAnimationGroup { (context) in
    context.duration = 1
    preferredContentSize = CGSize(width: 300, height: 300)
}

Но происходит то же самое.

Я почти уверен, что в NSViewController должен быть метод или что-то в этом роде, который я не могу найти...


person Sweeper    schedule 02.08.2019    source источник
comment
Я не понимаю, какое отношение представление листа окна имеет к NSOpenPanel или NSSavePanel.   -  person El Tomato    schedule 02.08.2019
comment
@ElTomato Мой вопрос не имеет прямого отношения к NSSavePanel. Я просто пытаюсь воссоздать поведение кнопки в NSSavePanel, а именно увеличение листа с анимацией.   -  person Sweeper    schedule 02.08.2019
comment
Есть метод для NSWindow: self.view.window?.setFrame(NSRect(x: 0, y: 0, width: 100, height: 100), display: true, animate: true)   -  person Ckacmaster    schedule 03.08.2019
comment
@Ckacmaster Вот оно! Это сработало! Я бы никогда не подумал, что это будет в NSWindow, потому что я думал, что view.window относится к фактическому окну (с тремя виджетами в левом верхнем углу и прочим), а не к листу.   -  person Sweeper    schedule 03.08.2019


Ответы (1)


В NSWindow есть способ сделать именно это:

self.view.window?.setFrame(NSRect(x: 0, y: 0, width: 100, height: 100), display: true, animate: true)
person Ckacmaster    schedule 03.08.2019
comment
При применении этого решения мое окно скользит сверху, но я хочу уменьшить размер снизу. Не могли бы вы сказать мне, в чем может быть проблема? - person hmali; 23.07.2020
comment
@hmali вам может потребоваться настроить ограничения просмотра. Используете ли вы NSSavePanel или пользовательский NSViewController для презентации? - person Ckacmaster; 29.09.2020