Реализация пользовательского представления для работы с автоматическим расположением
Автоматическое Расположение сокращает нагрузку на классах контроллера путем создания представлений большим количеством самоорганизации. При реализации пользовательского класса представления необходимо предоставить достаточно информации так, чтобы Автоматическая система Расположения могла сделать корректные вычисления и удовлетворить ограничения. В частности необходимо определить, имеет ли представление внутренний размер, и если так, реализация intrinsicContentSize
возвратить подходящее значение.
Представление указывает свой внутренний размер содержания
Представления уровня листа, такие как кнопки, обычно знают больше, о каком размере они должны быть, чем делает код, располагающий их. Это передается через метод intrinsicContentSize
, который говорит системе расположения, что существует некоторое содержание, это исходно не понимает в представлении, и который обеспечивает для системы расположения внутренний размер того содержания.
Типичным примером является однострочное текстовое поле. Система расположения не понимает текст — это должно просто быть сказано, что существует что-то в представлении, и что это, что-то потребует определенной суммы пространства для не отсечения содержания. Системные вызовы расположения intrinsicContentSize
, и устанавливает ограничения, указывающие (1), что непрозрачное содержание не должно быть сжато или отсечено и (2), который представление предпочитает обнимать плотно к его содержанию.
Представление может реализовать intrinsicContentSize
возвратить абсолютные значения для его ширины и высоты, или возвратиться NSViewNoInstrinsicMetric
или для или для оба, чтобы указать, что это не имеет никакой внутренней метрики для данной размерности.
Для дальнейших примеров рассмотрите следующие реализации intrinsicContentSize
:
Внутренний размер для кнопки диктуют ее заголовок и изображение. Кнопка
intrinsicContentSize
метод должен возвратить размер с шириной и высотой, достаточно большой, чтобы гарантировать, что текст заголовка не отсекается и что его все изображение видимо.Горизонтальный ползунок имеет внутреннюю высоту, но никакая внутренняя ширина, потому что иллюстрации ползунка не имеют никакой внутренней “лучшей ширины”. Горизонталь
NSSlider
возразите возвращает aCGSize
это установлено в{NSViewNoInstrinsicMetric, <slider height>}
. Любой пользователь ползунка должен будет обеспечить ограничения, управляющие шириной ползунка.Контейнер, такой как экземпляр
NSBox
, не имеет никакого внутреннего размера содержания и возвратов{ NSViewNoInstrinsicMetric, NSViewNoInstrinsicMetric }
. Его подпредставления могут иметь внутренние размеры содержания, но содержание подпредставлений не является внутренним самому полю.
Если их внутренний размер изменяется, представления должны уведомить автоматическое расположение
Если свойство Ваших изменений представления и того изменения влияет на внутренний размер содержания, Ваше представление должно вызвать invalidateIntrinsicContentSize
так, чтобы система расположения заметила изменение и могла повторно вычислить расположение. Например, текстовое поле вызывает invalidateIntrinsicContentSize
если изменяется строковое значение.
Расположение воздействует на прямоугольники выравнивания, не на кадры
При рассмотрении расположения имейте в виду, что кадр управления менее важен, чем его визуальная степень. В результате украшения, такие как тени и строки гравюры должны обычно игнорироваться в целях расположения. Интерфейсный Разработчик игнорирует их при расположении представлений о холсте — в следующем примере, руководство по Воде (штриховая синяя строка) выравнивается с визуальной степенью кнопки, не с кадром кнопки (существенный синий прямоугольник).
Для разрешения расположения на основе представления содержания, а не кадра представления обеспечивают прямоугольник выравнивания, который является тем, на что фактически воздействует расположение. Чтобы определить, корректно ли Ваше переопределение на OS X, можно установить NSViewShowAlignmentRects
значение по умолчанию к YES
нарисовать выравнивание rects.
Представления указывают базовые смещения
Часто, Вы хотите выровнять средства управления базовой линией. Несмотря на то, что Вы всегда были в состоянии выровняться против базовых линий в Интерфейсном Разработчике, не было ранее возможно сделать это программно. Можно сделать так теперь использование NSLayoutAttributeBaseline
в ограничении.
Метод baselineOffsetFromBottom
возвращает расстояние между NSLayoutAttributeBottom
и NSLayoutAttributeBaseline
. Это возвращаемое значение по умолчанию для NSView
0
; подклассы переопределяют этот метод, когда он целесообразен делать так.