Работа с иерархией представления

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

Что такое иерархия представления?

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

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

Рисунок 3-1 показывает окно примера приложения и его иерархию представления.

  Иерархия Представления рисунка 3-1
View hierarchy

Иерархия представления этого окна имеет эти части.

Преимущества иерархии представления

При управлении представлениями, поскольку иерархия приносит преимущества проектированию приложений несколькими способами:

Определение местоположения представлений в иерархии представления

Богатый выбор методов позволяет приложениям получать доступ к иерархии представления. superview метод возвращает представление, содержащее получатель, в то время как subviews метод возвращает массив, содержащий непосредственных потомков представления. Если представление является корнем иерархии представления, это возвращается nil когда спросили относительно его суперпредставления. Отправка представления window обменивайтесь сообщениями возвращает окно, представление находится в, или nil если представление в настоящее время не находится в иерархии представления окна. Рисунок 3-2 иллюстрирует отношения объектов в иерархии представления, показанной на рисунке 3-1.

  Отношения рисунка 3-2 среди объектов в иерархии
Relationships among objects in a hierarchy

Другие методы позволяют Вам проверять отношения среди представлений: isDescendantOf: подтверждает включение получателя; ancestorSharedWithView: находит общий контейнер, содержащий получатель и экземпляр представления указанный как параметр. Например, принимая иерархию представления как показано на рисунке 3-2, отправляя viewC a isDescendentOf: сообщение с contentView поскольку параметр возвращается YES. Отправка viewB ancestorSharedWithView: сообщение, передавая viewC как параметр, возвраты viewA.

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

Добавление и удаление представлений от иерархии

Создание подкласса представления с помощью initWithFrame: метод устанавливает NSView прямоугольник кадра объекта, но не вставляет его в иерархию представления окна. Вы делаете это путем отправки addSubview: обменивайтесь сообщениями к намеченному суперпредставлению, передавая представление для вставки как параметр. Прямоугольник кадра тогда интерпретируется с точки зрения суперпредставления, должным образом определяя местоположение нового представления и его местом в иерархии представления и его расположением в окне суперпредставления. Существующее представление в иерархии представления может быть заменено путем отправки суперпредставления a replaceSubview:with: сообщение, передавая представление для замены и замена просматривает как параметры. Дополнительный метод, addSubview:positioned:relativeTo:, позволяет Вам указывать упорядочивание представлений.

Вы удаляете представление из иерархии представления путем отправки ему a removeFromSuperview сообщение. removeFromSuperviewWithoutNeedingDisplay метод подобен, удаляя получатель из его суперпредставления, но это не заставляет суперпредставление перерисовывать.

Когда NSView объект добавляется как подпредставление другого представления, он автоматически вызывает viewWillMoveToSuperview: и viewWillMoveToWindow: методы. Можно переопределить эти методы, чтобы позволить экземпляру запрашивать свое новое суперпредставление или окно о соответствующем состоянии и самом обновлении соответственно.

Менять местоположение и изменение размеров представлений

Менять местоположение или изменение размеров представления являются потенциально сложной работой. То, когда представление перемещает или изменяет размеры его, может представить части его суперпредставления, которые не были ранее видимы, требуя, чтобы суперпредставление восстановило изображение. Изменение размеров может также влиять на расположение подпредставлений представления. Изменения в расположении представления в любом случае могут представлять интерес для других объектов, которые, возможно, должны были бы быть уведомлены относительно изменения. Следующие разделы исследуют каждую из этих областей.

Перемещение и изменение размеров представлений программно

После того, как экземпляр представления был создан, можно переместить его программно использующий любой из устанавливающих кадр методов: setFrame:, setFrameOrigin:, и setFrameSize:. Если прямоугольник границ представления не был явно установлен с помощью одного из setBounds... методы, прямоугольник границ представления автоматически обновляется для соответствия нового типа телосложения.

При изменении прямоугольника кадра позиция и размер прямоугольников кадра подпредставлений часто должны изменяться также. Если возвращается измененное местоположение представление YES для autoresizesSubviews, его подпредставления автоматически изменены, как описано в Автоизменении размеров Подпредставлений. Иначе, это - ответственность приложения изменить местоположение и изменить размеры подпредставлений вручную.

Автоизменение размеров подпредставлений

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

Интерфейсный Разработчик позволяет Вам устанавливать маску автоизменения размеров представления графически с ее инспектором Размера, и в тестовом режиме можно сразу исследовать эффекты автоизменения размеров. Маска автоизменения размеров может также быть установлена программно.

Маска автоизменения размеров представления указана путем объединения констант маски автоизменения размеров с помощью оператора битового «ИЛИ» и отправив представление a setAutoresizingMask: сообщение, передавая маску как параметр. Таблица 3-1 показывает каждую постоянную маску и как это производит поведение изменения размеров представления.

Таблица 3-1  , Автоизменяющая размеры констант маски

Автоизменение размеров маски

Описание

NSViewHeightSizable

Если установлено, высота представления изменяется пропорционально на изменение в высоте суперпредставления. Иначе, высота представления не изменяется относительно высоты суперпредставления.

NSViewWidthSizable

Если установлено, изменения представления width пропорционально в изменении в суперпредставлении width. Иначе, представление width не изменяется относительно суперпредставления width.

NSViewMinXMargin

Если установлено, левый край представления изменен местоположение пропорционально к изменению в суперпредставлении width. Иначе, левый край представления остается в той же позиции относительно левого края суперпредставления.

NSViewMaxXMargin

Если установлено, правый край представления изменен местоположение пропорционально к изменению в суперпредставлении width. Иначе, правый край представления остается в той же позиции относительно суперпредставления.

NSViewMinYMargin

Если установлено и суперпредставление не зеркально отражается, главный край представления изменен местоположение пропорционально к изменению в высоте суперпредставления. Иначе, главный край представления остается в той же позиции относительно суперпредставления.

Если установлено и суперпредставление зеркально отражается, базовый край представления изменен местоположение пропорционально к изменению в высоте суперпредставления. Иначе, базовый край представления остается в той же позиции относительно суперпредставления.

NSViewMaxYMargin

Если установлено и суперпредставление не зеркально отражается, базовый край представления изменен местоположение пропорциональный изменению в высоте суперпредставления. Иначе, базовый край представления остается в той же позиции относительно суперпредставления.

Если установлено и суперпредставление зеркально отражается, главный край представления изменен местоположение пропорциональный изменению в высоте суперпредставления. Иначе, главный край представления остается в той же позиции относительно суперпредставления.

Например, для хранения представления в нижнем левом углу его суперпредставления Вы указываете NSViewMaxXMargin | NSViewMaxYMargin. Когда больше чем один аспект вдоль оси сделан гибким, изменять размеры сумма распределяется равномерно среди них. Рисунок 3-3 обеспечивает графическое представление позиции постоянных значений и в нормальных и в зеркально отраженных суперпредставлениях.

  Представление рисунка 3-3, автоизменяющее размеры констант маски
View autoresize flags

Когда одна из этих констант опущена, расположение представления фиксируется в том аспекте; когда константа включена в маску, расположение представления гибко в том аспекте. Включая константу в маске совпадает с конфигурированием что автоизменение размеров аспекта с пружиной в Интерфейсном Разработчике.

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

Подкласс может переопределить resizeSubviewsWithOldSize: или resizeWithOldSuperviewSize: настроить поведение автоизменения размеров для представления. Представление resizeSubviewsWithOldSize: метод вызывается автоматически представлением каждый раз, когда изменяется его тип телосложения. Этот метод тогда просто отправляет a resizeWithOldSuperviewSize: обменивайтесь сообщениями к каждому подпредставлению. Каждое подпредставление сравнивает старый тип телосложения с новым размером и корректирует его позицию и размер согласно его автоизменять размеры маски.

Уведомления

Вне изменения размеров его подпредставлений, по умолчанию NSView широковещательные уведомления экземпляра заинтересованным наблюдателям любое время его границы или прямоугольное изменение кадра. Имена уведомления NSViewFrameDidChangeNotification и NSViewBoundsDidChangeNotification, соответственно.

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

По умолчанию оба кадра и прямоугольные изменения границ отправляются за экземпляром представления. Можно предотвратить NSView экземпляр от обеспечения использования уведомлений setPostsFrameChangedNotifications: и setPostsBoundsChangedNotifications: и передача NO как параметр. Если Ваше приложение делает сложное расположение представления, выключая уведомления изменения, прежде чем расположение и затем восстанавливая их после завершения сможет обеспечить повышение производительности. Как со всей настройкой производительности, лучше первая выборка Ваше приложение определять, оказывают ли уведомления изменения негативное влияние на производительность.

Сокрытие представлений

Вы скрываете и «выводите на экран» (т.е. покажите), представления приложения Какао с помощью NSView метод setHidden:. Этот метод берет булев параметр: YES (скройте представление получения), или NO (покажите получатель).

Когда Вы скрываете представление с помощью setHidden: метод, которым это остается в его иерархии представления, даже при том, что это исчезает из своего окна и не получает входные события. Скрытое представление остается в списке его суперпредставления подпредставлений и участвует в автоизменении размеров. Если представление, отмеченное, как скрытый, имеет подпредставления, они и их потомки представления скрыты также. При сокрытии представления Набор Приложения также отключает любой прямоугольник курсора, прямоугольник подсказки или прямоугольник отслеживания, связанный с представлением.

Сокрытие представления, которое является текущим первым респондентом окна, вызывает следующее допустимое ключевое представление представления (nextValidKeyView) стать новым первым респондентом. Скрытое представление остается в nextKeyView цепочка представлений это было ранее частью, но проигнорировано во время перемещения с помощью клавиатуры.

Можно запросить скрытое состояние представления путем отправки его также isHidden или isHiddenOrHasHiddenAncestor (оба определенные NSView). Прежние возвраты метода YES когда представление было явно отмечено, как скрытый с a setHidden: сообщение. Последние возвраты YES и когда представление было явно отмечено, как скрытый и когда оно скрыто, потому что представление наследователя было отмечено, как скрытый.

Преобразование координат в иерархии представления

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

Табличные 3-2  методы преобразования координаты

Преобразуйте в получатель от указанного представления

Преобразуйте от получателя до указанного представления

convertPoint:fromView:

convertPoint:toView:

convertRect:fromView:

convertRect:toView:

convertSize:fromView:

convertSize:toView:

convert...:fromView: методы преобразовывают значения в систему координат получателя от системы координат представления, переданного как второй параметр. Если nil передается как представление, значения, как предполагается, находятся в основе окна (координатное пространство окна) система координат и преобразовываются в систему координат получателя. convertPoint:fromView: метод обычно используется для преобразования координат события от нажатия мыши, которыми предоставлены NSEvent как относительно окна, к получению просматривают как показано в Перечислении 3-1.

  Использование расположений события Listing 3-1 Converting convertPoint:fromView:

 
-(void)mouseDown:(NSEvent *)event
{
    NSPoint clickLocation;
 
    // convert the click location into the view coords
    clickLocation = [self convertPoint:[event locationInWindow]
                              fromView:nil];
    // do something with the click location
}

convert..:toView: методы делают инверсия, преобразовывая значения в системе координат получателя к системе координат представления передала в качестве параметра. Если параметр представления nil, значения преобразовываются в основную систему координат окна получателя.

Для преобразования в и от системы координаты экрана, NSWindow определяет convertBaseToScreen: и convertScreenToBase: методы. Используя NSView методы преобразования вместе с этими методами позволяют Вам преобразовывать геометрическую структуру между системой координат представления и экран только с двумя сообщениями, как показано в Перечислении 3-2.

Перечисление 3-2  , Преобразовывающее расположение представления в расположение на экране

NSPoint pointInWindowCoordinates;
NSPoint pointInScreenCoords;
 
pointInWindowCoordinates=[self convertPoint:viewLocation toView:nil];
pointInScreenCoords=[[self window] convertBaseToScreen:pointInWindowCoordinates];

Когда никакое представление не повернуто или при контакте только с точками, преобразование является прямым. При преобразовании прямоугольников или размеров между представлениями с различными вращениями, геометрическая структура должна быть изменена разумным способом. В преобразовании прямоугольника, NSView класс делает предположение, что Вы хотите гарантировать покрытие исходной экранной области. С этой целью преобразованный прямоугольник увеличен так, чтобы, когда расположено в надлежащем представлении, он полностью покрыл исходный прямоугольник. Рисунок 3-4 показывает преобразование прямоугольника в rotatedView система координат объекта к тому из ее суперпредставления, outerView.

  Преобразование рисунка 3-4 оценивает в повернутом представлении
Converting values in a rotated view

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

Преобразование координат представления к и от основного пространства

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

- (NSRect)convertRectToBase:(NSRect)aRect;
- (NSPoint)convertPointToBase:(NSPoint)aPoint;
- (NSSize)convertSizeToBase:(NSSize)aSize;
- (NSRect)convertRectFromBase:(NSRect)aRect;
- (NSPoint)convertPointFromBase:(NSPoint)aPoint;
- (NSSize)convertSizeFromBase:(NSSize)aSize;

Для рендеринга традиционного взгляда, в котором иерархия представления нарисована сглаженная в запоминающее устройство окна, это «основное» пространство совпадает с системой координат окна, и результаты использования этих новых методов совпадают с геометрией преобразования к и от представления nil использование существующих методов преобразования обсуждено в Таблице 3-2.

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

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

При использовании поддержанных уровнем представлений в масштабном коэффициенте пользовательского интерфейса кроме 1,0, обратите внимание на то, что размерности представления и размерности его соответствующего уровня поддержки будут варьироваться согласно масштабному коэффициенту с тех пор CALayer границы всегда выражаются в пикселях, в то время как NSView размерности остаются выраженными в точках. У большинства клиентов поддержанных уровнем представлений не будет потребности выполнить операции непосредственно в пространстве уровня, но для тех, которые делают важно использовать предыдущие методы для преобразования геометрических количеств между пространством представления и уровнем («основное») пространство в надлежащих случаях.

Теги представления

NSView класс определяет методы, позволяющие, Вы для тегирования частного лица просматриваете объекты с целочисленными тегами и искать иерархию представления на основе тех тегов. Подпредставления получателя ищутся в глубину, запускающийся при первом подпредставлении, возвращенном получателем subviews метод.

NSView метод tag всегда возвраты –1. Подклассы могут переопределить этот метод для возврата различного значения. Подклассу свойственно реализовать a setTag: метод, хранящий значение тега в переменной экземпляра, позволяя тегу быть установленным на отдельной основе представления. Несколько классов Набора Приложения, включая NSControl подклассы, сделайте просто это. viewWithTag: метод продолжает через всех потомков получателя (включая себя) использование поиска в глубину, от наоборот в иерархии представления получателя, поиск подпредставления с данным тегом и возврата его, если это найдено.