Реализация пользовательского представления для работы с автоматическим расположением

Автоматическое Расположение сокращает нагрузку на классах контроллера путем создания представлений большим количеством самоорганизации. При реализации пользовательского класса представления необходимо предоставить достаточно информации так, чтобы Автоматическая система Расположения могла сделать корректные вычисления и удовлетворить ограничения. В частности необходимо определить, имеет ли представление внутренний размер, и если так, реализация intrinsicContentSize возвратить подходящее значение.

Представление указывает свой внутренний размер содержания

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

Типичным примером является однострочное текстовое поле. Система расположения не понимает текст — это должно просто быть сказано, что существует что-то в представлении, и что это, что-то потребует определенной суммы пространства для не отсечения содержания. Системные вызовы расположения intrinsicContentSize, и устанавливает ограничения, указывающие (1), что непрозрачное содержание не должно быть сжато или отсечено и (2), который представление предпочитает обнимать плотно к его содержанию.

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

Для дальнейших примеров рассмотрите следующие реализации intrinsicContentSize:

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

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

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

При рассмотрении расположения имейте в виду, что кадр управления менее важен, чем его визуальная степень. В результате украшения, такие как тени и строки гравюры должны обычно игнорироваться в целях расположения. Интерфейсный Разработчик игнорирует их при расположении представлений о холсте — в следующем примере, руководство по Воде (штриховая синяя строка) выравнивается с визуальной степенью кнопки, не с кадром кнопки (существенный синий прямоугольник).

../Art/buttonGuideFrame.png

Для разрешения расположения на основе представления содержания, а не кадра представления обеспечивают прямоугольник выравнивания, который является тем, на что фактически воздействует расположение. Чтобы определить, корректно ли Ваше переопределение на OS X, можно установить NSViewShowAlignmentRects значение по умолчанию к YES нарисовать выравнивание rects.

Представления указывают базовые смещения

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

Метод baselineOffsetFromBottom возвращает расстояние между NSLayoutAttributeBottom и NSLayoutAttributeBaseline. Это возвращаемое значение по умолчанию для NSView 0; подклассы переопределяют этот метод, когда он целесообразен делать так.