Ответ 1
Да, это можно сделать.
Если вы установите представление translatesAutoresizingMaskIntoConstraints = YES
, вызовы setFrame:
будут автоматически переведены во время выполнения в ограничения компоновки на основе текущего представления autoresizingMask
. Это позволяет смешивать фрейм-макет с компоновкой на основе ограничений.
Например, вы можете использовать Auto Layout для определения макета всех подзонов представления, но все равно вызовите setFrame:
, чтобы установить размер и положение самого представления. С вашей точки зрения, вы делаете макет с сочетанием автоматического макета и прямой обработки кадров. Но система фактически использует ограничения для обработки всего.
Однако существует одна большая оговорка об использовании translatesAutoresizingMaskIntoConstraints
.
Когда вы это делаете, вам все равно нужно убедиться, что эти автоматические ограничения могут быть удовлетворены остальными вашими ограничениями.
Итак, предположим, что уже существуют ограничения, определяющие размер и положение вашего представления, а затем вы также устанавливаете translatesAutoresizingMaskIntoConstraints = YES
и называете setFrame:
. Вызов setFrame:
приведет к созданию новых ограничений для представления, которые, вероятно, будут противоречить уже существующим ограничениям.
(На самом деле эта ошибка происходит часто. Если вы когда-нибудь видите сообщение журнала, жалующееся на конфликтующие ограничения, и одно из этих ограничений - NSAutoresizingMaskLayoutConstraint
, то то, что вы видите, является конфликтом с автоматическим ограничением. это простая ошибка, потому что translatesAutoresizingMaskIntoConstraints = YES
является значением по умолчанию, поэтому, если вы настраиваете ограничения в коде, вам нужно забыть отключить его, если вам не нужны эти автоматические ограничения.)
В противоположность этому, предположим, что уже существуют ограничения, определяющие размер и положение вашего представления, но затем вы устанавливаете translatesAutoresizingMaskIntoConstraints = NO
перед тем, как позвонить setFrame:
. В этом случае ваши вызовы setFrame:
не будут создавать новые ограничения, поэтому конфликт между отдельными ограничениями не будет. Однако в этом случае по-прежнему существует "конфликт" между ограничениями и установленным значением фрейма. В следующий раз, когда вызывается автоматический макет, он увидит уже существующие ограничения в представлении, вычислит требуемое значение фрейма и установит фрейм на нужное значение, сбрасывая значение, которое вы устанавливаете вручную.
Подробнее см. раздел "Принятие автоматической компоновки" в Apple Cocoa Руководство по автоматическому макету.