Работа с иерархией представления
Вместе с их собственной непосредственной ответственностью для рисования и обработки событий, представления также действуют как контейнеры для других представлений, создавая иерархию представления. В этой главе описываются иерархию представления, ее преимущества, и как Вы работаете с представлениями в иерархии.
Что такое иерархия представления?
В дополнение к ответственности за рисование и обработку пользовательских событий, экземпляр представления может действовать как контейнер, включая другие экземпляры представления. Те представления соединяются, вместе создавая иерархию представления. В отличие от иерархии классов, определяющей происхождение класса, иерархия представления определяет расположение представлений относительно других представлений.
Экземпляр окна поддерживает ссылку на единственный экземпляр представления верхнего уровня, вызовите довольное представление. Довольное представление действует как корень видимой иерархии представления в окне. Экземпляры представления, включенные в представлении, вызывают подпредставлениями. Родительское представление, включающее представление, упоминается как его суперпредставление. В то время как экземпляр представления может иметь многократные подпредставления, он может иметь только одно суперпредставление. Для представления и его подпредставлений, чтобы быть видимым пользователю, представление должно быть вставлено в иерархию представления окна.
Рисунок 3-1 показывает окно примера приложения и его иерархию представления.
Иерархия представления этого окна имеет эти части.
Окно представлено
NSWindow
экземпляр.Довольное представление служит корнем иерархии представления окна.
Довольное представление содержит единственное подпредставление, экземпляр пользовательского класса (который смотрит замечательно как
NSBox
, но не.).Пользовательский экземпляр представления, что, поочередно имеет два подпредставления,
NSButton
экземпляр, иNSTextField
экземпляр.Суперпредставление и для поля кнопки и для текстового поля
NSBox
объект. Пользовательский контейнер представления фактически включает представления текстового поля и поле кнопки.
Преимущества иерархии представления
При управлении представлениями, поскольку иерархия приносит преимущества проектированию приложений несколькими способами:
Сложная функциональность представления может быть собрана при помощи более простого
NSView
подклассы, избегая монолитных и сложных классов представления. Например, графическая клавиатура могла бы бытьNSView
использующий подклассNSButton
подпредставления для каждого ключа.Система координат каждого подпредставления расположена относительно системы координат ее суперпредставления.
NSView
экземпляры расположены в их суперпредставлениях, так, чтобы когдаNSView
экземпляр перемещен, или его система координат преобразовывается, все его подпредставления перемещены и преобразованы с ним. Точно так же масштабированиеNSView
экземпляр заставляет все подпредставления масштабировать их получение относительно суперпредставления. Так как каждое представление рисует в его собственной системе координат, его инструкции получения остаются постоянными независимо от того, где оно или его суперпредставление углубляют экран или как оно масштабируется.Иерархия представления обеспечивает ясное определение ответственности за обработку событий. Когда представление получает событие, на которое оно не отвечает, событие передается иерархия представления посредством суперпредставления для обработки. Иерархия представления ключевого окна принимает участие в цепочке респондента приложения.
Иерархия представления также обеспечивает определенную структуру для управления перерисовкой содержания окна. Когда
NSView
экземпляр получает запрос дисплея, он рисует себя, и затем передает ответственность за получение перед каждым из ее подпредставлений поочередно. Каждое ответвление иерархии представления завершает получение, прежде чем начнется следующее ответвление.Иерархия представления является динамичной. Это может быть реконфигурировано как выполнение приложения. Экземпляры представления могут быть перемещены от окна до окна и установлены как подпредставление сначала одного суперпредставления, затем другого.
Определение местоположения представлений в иерархии представления
Богатый выбор методов позволяет приложениям получать доступ к иерархии представления. superview
метод возвращает представление, содержащее получатель, в то время как subviews
метод возвращает массив, содержащий непосредственных потомков представления. Если представление является корнем иерархии представления, это возвращается nil
когда спросили относительно его суперпредставления. Отправка представления window
обменивайтесь сообщениями возвращает окно, представление находится в, или nil
если представление в настоящее время не находится в иерархии представления окна. Рисунок 3-2 иллюстрирует отношения объектов в иерархии представления, показанной на рисунке 3-1.
Другие методы позволяют Вам проверять отношения среди представлений: 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 показывает каждую постоянную маску и как это производит поведение изменения размеров представления.
Автоизменение размеров маски | Описание |
---|---|
| Если установлено, высота представления изменяется пропорционально на изменение в высоте суперпредставления. Иначе, высота представления не изменяется относительно высоты суперпредставления. |
| Если установлено, изменения представления width пропорционально в изменении в суперпредставлении width. Иначе, представление width не изменяется относительно суперпредставления width. |
| Если установлено, левый край представления изменен местоположение пропорционально к изменению в суперпредставлении width. Иначе, левый край представления остается в той же позиции относительно левого края суперпредставления. |
| Если установлено, правый край представления изменен местоположение пропорционально к изменению в суперпредставлении width. Иначе, правый край представления остается в той же позиции относительно суперпредставления. |
| Если установлено и суперпредставление не зеркально отражается, главный край представления изменен местоположение пропорционально к изменению в высоте суперпредставления. Иначе, главный край представления остается в той же позиции относительно суперпредставления. Если установлено и суперпредставление зеркально отражается, базовый край представления изменен местоположение пропорционально к изменению в высоте суперпредставления. Иначе, базовый край представления остается в той же позиции относительно суперпредставления. |
| Если установлено и суперпредставление не зеркально отражается, базовый край представления изменен местоположение пропорциональный изменению в высоте суперпредставления. Иначе, базовый край представления остается в той же позиции относительно суперпредставления. Если установлено и суперпредставление зеркально отражается, главный край представления изменен местоположение пропорциональный изменению в высоте суперпредставления. Иначе, главный край представления остается в той же позиции относительно суперпредставления. |
Например, для хранения представления в нижнем левом углу его суперпредставления Вы указываете NSViewMaxXMargin
| NSViewMaxYMargin
. Когда больше чем один аспект вдоль оси сделан гибким, изменять размеры сумма распределяется равномерно среди них. Рисунок 3-3 обеспечивает графическое представление позиции постоянных значений и в нормальных и в зеркально отраженных суперпредставлениях.
Когда одна из этих констант опущена, расположение представления фиксируется в том аспекте; когда константа включена в маску, расположение представления гибко в том аспекте. Включая константу в маске совпадает с конфигурированием что автоизменение размеров аспекта с пружиной в Интерфейсном Разработчике.
Когда Вы выключаете автоизменение размеров представления, все его потомки аналогично экранируются от изменений в суперпредставлении. Изменения в подпредставлениях, однако, могут все еще проникнуть вниз. Точно так же, если подпредставление имеет, не автоизменяют размеры маски, оно не изменится в размере, и поэтому ни одно из его подпредставлений не автоизменяет размеры.
Подкласс может переопределить 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
класс определяет шесть методов, преобразовывающих прямоугольники, точки и размеры в любом направлении:
Преобразуйте в получатель от указанного представления | Преобразуйте от получателя до указанного представления |
---|---|
|
|
|
|
|
|
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
.
В преобразовании размера, 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:
метод продолжает через всех потомков получателя (включая себя) использование поиска в глубину, от наоборот в иерархии представления получателя, поиск подпредставления с данным тегом и возврата его, если это найдено.