2012-03-22 2 views
2

Если пользователь масштабирует главное окно нашего приложения, закрывает приложение, а затем снова открывает его, мы хотим восстановить последнее состояние главного окна, поэтому мы увеличиваем его до отображения окна. Приложение открывается с увеличением, поэтому все отлично.При повторном открытии приложения, как восстановить увеличенное состояние без проблем?

Однако, если пользователь снова нажимает кнопку масштабирования, ничего не происходит. Я считаю, что это объясняется тем, что documentation for zoom: говорит для шага 5:

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

Я думаю, что это не unzoom, потому что нет пользовательского состояния, но я не уверен, почему - не должен ли пользователь указывать, «размер окна был до того, как он был увеличен»? Если нет, как я могу убедиться, что пользовательское состояние установлено правильно, чтобы окно не увеличивалось, когда пользователь снова нажимает кнопку масштабирования?

Редактировать: MrGomez отвечает ниже, что это в основном то, как оно предназначено для работы. Однако это не похоже на то, как ведут себя другие приложения. Попробуйте Safari - увеличьте масштаб, затем закройте, затем снова откройте окно и восстановите его с увеличенным размером. Нажмите кнопку масштабирования, и она вернется к меньшему размеру. iCal - то же самое. Как это делают эти приложения?

ответ

2

Проблема в том, что это ожидаемое поведение. Как упоминалось здесь:

мы хотим восстановить последнее состояние главного окна, так что увеличить его перед показом окна

Вы пошли вперед и установить точку зрения пользователя, как ваш стандартный вид. Исходный вид по умолчанию не сохранен.

This thread подробно идет о предполагаемой функциональности zoom:. Цитирование принятого ответа:

Согласно документации по методу zoom: (обратите внимание на :), то обратной zoom: является zoom::

Этого метод действия переключает размер и расположение окна между его стандартное состояние (предоставляемое приложением как «лучший» размер до , отображает данные окна) и его пользовательское состояние (новый размер и местоположение , которые пользователь мог установить путем перемещения или изменения размера окна).

Если он находится в состоянии пользователя (не масштабируется), она будет меняться к стандартному состоянию (увеличение), и если он находится в нормальном состоянии (увеличенный), она будет меняться в состояние пользователя (Unzoom).

документация также отмечает:

Если нет сохраненного состояния пользователя, потому что не было никакого предыдущего масштабирования, размер и расположение окна не меняется.

Это то, что произойдет, если вы запустили окно в стандартном состоянии ; так как он никогда не был в каком-либо другом состоянии, для него нет ничего , чтобы вернуть обратно.

Проблема в том, что вы переопределили стандартное состояние; Целью zoom: является переключение между представлением пользователя и стандартным представлением вашего интерфейса. Чтобы сохранить состояние окна пользователя для последующего восстановления, выполните this guide.

И, для справки, вот остальная часть OSX's style guidelines и a very good tutorial за то, как вы должны работать с этим ограничением.


Редактировать: Как уже обсуждались, это также вопрос о модальности UI и тот факте, OSX окно может быть бимодальным (состояние пользователя, развернутое состояние) или тримодальным (состояние пользователя, стандартного состояния, Развернутое состояние) с потеря пользовательского состояния, когда приложение закрыто в максимизированном состоянии. Похоже, что оно воспроизводится с использованием стандартных приложений для OSX, включая, например, iCal.app.

В результате лучшее, что можно сделать здесь, - это определить функционирующую парадигму интерфейса, совместимую с приложениями для OSX, но несет в себе многие из тех же idiosyncrasies of the little green glob.

+0

Это не похоже на то, как ведут себя другие приложения. Попробуйте Safari - увеличьте масштаб, затем закройте, затем снова откройте окно и восстановите его с увеличенным размером. Нажмите кнопку масштабирования, и она вернется к меньшему размеру. iCal - то же самое. Как это делают эти приложения? – Colen

+0

@Colen Насколько я знаю, они делают это [https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/WinPanel/Tasks/SavingWindowPosition.html#//apple_ref/DOC/UID/20000229-BCIDIHBB). Я обновлю свой ответ, потому что он безрезультатен без него. – MrGomez

+0

ОК, я создал небольшое тестовое приложение, которое ничего не делает, кроме вызова setFrameUsingName/saveFrameUsingName при запуске/завершении работы, чтобы сохранить и восстановить позицию окна. Если я запустил его, переместите его в другое место на экране, закройте его и перезапустите, новая позиция будет восстановлена. Если я увеличу его, закройте и перезапустите, увеличенное положение будет восстановлено. Все, как ожидалось, до сих пор. Тем не менее, если я затем нажму zoom, чтобы разблокировать его, он отключится до положения окна * по умолчанию *, а не нового * окна, которое я использовал. Я был бы в порядке с этим поведением - любая идея, как вызвать это? Спасибо за вашу помощь! – Colen

Смежные вопросы