Калибровка и размещение Windows

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

Установка размера и расположения окна

center метод помещает окно в самое видное расположение на экране, одном подходящем для важных сообщений и предупредительных диалоговых окон.

Можно изменить размеры или изменить местоположение использования окна setFrame:display: или setFrame:display:animate:— прежний эквивалентен последнему с анимационным флагом NO. Вы могли бы использовать эти методы в частности, чтобы развернуть или заключить окно, чтобы показать или скрыть подпредставление (такое как управление, которое может быть представлено путем щелчка по треугольнику раскрытия). Если анимационный параметр в setFrame:display:animate: YES, метод выполняет гладкое, изменяют размеры окна, где общее время для изменения размеры может быть получено путем вызова animationResizeTime:.

Пользователь может изменить размеры окон путем перетаскивания в правом нижнем углу окна. В то время как пользователь изменяет размеры окна, inLiveResize возвратится YES. Иначе, это возвращается NO. Пользователь может обычно менять местоположение окон путем перетаскивания только строки заголовка. Если Вы хотите, чтобы пользователи были в состоянии перетащить Ваше окно путем щелчка в другом месте, необходимо переопределить mouseDownCanMoveWindow так, чтобы это возвратилось YES в любых представлениях, что Вы хотите быть перемещаемыми окнами пропускания волн. Методы isMovable и setMovable: определите, может ли пользователь переместить окно путем щелчка в его строке заголовка или фоне.

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

- (IBAction)showAdditionalControls:sender
{
    NSRect frame = [myWindow frame];
    if (frame.size.width <= MIN_WIDTH_WITH_ADDITIONS)
        frame.size.width = MIN_WIDTH_WITH_ADDITIONS;
    frame.size.height += ADDITIONS_HEIGHT;
    frame.origin.y -= ADDITIONS_HEIGHT;
    [myWindow setFrame:frame display:YES animate:YES];
    // implementation continues...

Обратите внимание на то, что делегат окна не получает windowWillResize:toSize: сообщения, когда окно изменено таким образом. Это - Ваша ответственность гарантировать, что новый размер окна приемлем.

Делегат окна действительно получает windowDidResize: сообщения. Можно реализовать windowDidResize: добавить или удалить подпредставления в подходящих соединениях. Нет никаких дополнительных флагов, чтобы обозначить, что окно выполняет анимированное, изменяют размеры работы (в отличие от инициируемого пользователями, изменяют размеры). Поэтому ваше дело получать соответствующую информацию состояния так, чтобы можно было обновить содержание окна соответственно в windowDidResize:.

Расположение каскадом окна

При использовании архитектуры документа Какао можно использовать setShouldCascadeWindows: метод NSWindowController чтобы установить ли, окно, когда это выведено на экран, должно расположиться каскадом в связи с другими окнами документа (т.е. иметь немного расположение смещения так, чтобы строки заголовка ранее выведенных на экран окон были все еще видимы). Значение по умолчанию является истиной, так обычно у Вас нет дополнительной работы для выполнения.

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

Изменение масштаба окна

Вы используете zoom: метод для переключения размера и расположения окна между его стандартным состоянием, как определено приложением, и его пользовательским состоянием: новый размер и расположение пользователь, возможно, установили путем перемещения или изменения размеров окна.

Ограничение размера и расположения окна

Можно использовать setContentMinSize: и setContentMaxSize: для ограничения возможности пользователя изменить размеры окна — отмечают, что можно все еще установить его в любой размер программно. Точно так же можно использовать setContentAspectRatio: для хранения окна width и высота в тех же пропорциях как, пользователь изменяет размеры его, и setContentResizeIncrements: заставить окно изменить размеры в дискретных суммах, больше, чем единственный пиксель. (Форматное соотношение и изменяет размеры инкрементов, взаимоисключающие атрибуты.) В целом необходимо использовать setContent... методы вместо тех, которые влияют на кадр окна (setAspectRatio:, setMaxSize:, и т.д.). Они предпочтены, потому что они избегают беспорядка для окон с панелями инструментов, и также обычно являются лучшей моделью, так как Вы управляете содержанием окна, но не кадра.

Можно использовать constrainFrameRect:toScreen: метод для корректировки предложенного прямоугольника кадра так, чтобы это нашлось на экране таким способом, которым пользователь может переместить и изменить размеры окна. Однако необходимо удостовериться, что окно соответствует на экране перед дисплеем. Обратите внимание на то, что любой NSWindow со строкой заголовка автоматически ограничивает себя на экран. cascadeTopLeftFromPoint: метод смещает верхнюю левую точку на сумму, позволяющую одному окну быть помещенным относительно другого так, чтобы обе их строки заголовка были видимы.

Кроме того, когда окно собирается быть измененным, делегат окна будет отправлен a windowWillResize:toSize: сообщение. Можно реализовать тот метод в делегате для простого управления размером окна.