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