У меня есть представление, фрейм которого нужно манипулировать программно - это своего рода представление документа, которое оборачивается его содержимым, которое затем прокручивается и масштабируется вокруг супервизора, манипулируя источником кадра. Autolayout борется с этим во время выполнения.
Полное отключение автоматического размещения кажется немного суровым, потому что его можно разумно использовать для обработки макета для других представлений. Похоже, что мне нужно какое-то «нулевое ограничение».
источник
У меня была аналогичная проблема, когда Autolayout переопределял некоторые из моих настроек кадра во время выполнения (у меня было динамическое представление, которое в некоторых случаях подталкивало новый контроллер представления ... нажатие, а затем нажатие Back приводило к сбросу исходного представления).
Я обошел это, поместив свой код манипуляции в
viewDidLayoutSubviews
свой контроллер представления. Кажется, это вызывается после того, как вызывается ограничение mojo, но до viewDidAppear, поэтому пользователь ничего не понимает.источник
Может быть , просто установив
translatesAutoresizingMaskIntoConstraints
наYES
(а не добавление дополнительных ограничений , влияющие на эту точку зрения) позволит вам установить рамки без боя системы автоматической компоновки.источник
В iOS 8 вы можете сделать NSLayoutConstraint активным или нет. Поэтому, если я использую конструктор интерфейсов, я добавляю все свои ограничения в OutletCollection, а затем активирую или деактивирую, используя:
Конкретное приложение, в котором я его использую, имеет разные ограничения в портретном и ландшафтном режимах, и я активирую / деактивирую в зависимости от поворота устройства. Это означает, что я могу создать несколько сложных изменений макета в конструкторе интерфейсов для обеих ориентаций и по-прежнему использовать автоматический макет без подробного кода автоматического макета.
Или вы можете активировать / деактивировать с помощью removeConstraints и addConstraints.
источник
Я не знаю, поможет ли это кому-нибудь еще, но я написал категорию, чтобы сделать это удобным, потому что я часто этим занимаюсь.
UIView + DisableAutolayoutTempoporary.h
UIView + DisableAutolayoutTempohibited.m
Я использую это так:
Надеюсь, поможет.
источник
Вы можете установить
translatesAutoresizingMaskIntoConstraints
типBoolean
, значение «Да» в определяемых пользователем атрибутах времени выполнения UIView, который вы хотите в xib / раскадровке.источник
Вы можете разделить на несколько раскадровок, если хотите использовать автоматическое размещение для некоторых представлений.
источник
Для меня это сработало, чтобы создать подпредставление программно, в моем случае автоматический макет мешал представлению, которое мне нужно было вращать вокруг его центра, но как только я создал это представление программно, оно сработало.
источник
На мой взгляд, у меня были метка и текст. На этикетке был жест панорамирования. Этикетка нормально перемещается во время перетаскивания. Но когда я использую клавиатуру текстового поля, метка сбрасывает свое положение в исходное положение, определенное в автоматическом макете. Проблема была решена, когда я быстро добавил следующее для метки. Я добавил это в viewWillAppear, но его можно добавить практически везде, где есть доступ к целевому полю.
источник
Это случилось со мной в проекте без раскадровки или файлов xib. Все 100% код. У меня был рекламный баннер внизу, и я хотел, чтобы границы просмотра ограничивались рекламным баннером. Размер представления изменится автоматически после загрузки. Я пробовал все разрешения на этой странице, но ни одно из них не помогло.
В итоге я просто создал подвид с укороченной высотой и поместил его в основной вид контроллера. Затем весь мой контент попал в подвид. Это очень легко решило проблему, не делая ничего, что казалось бы идущим против течения.
Я думаю, если вам нужен вид, который не соответствует нормальному размеру, который заполняет окно, вы должны использовать для этого подвид.
источник
Я столкнулся с аналогичным сценарием, когда я присоединился к проекту, который был начат с автоматической компоновкой, но мне нужно было внести динамические корректировки в несколько представлений. Вот что у меня сработало:
НЕ размещайте представления или компоненты в построителе интерфейса.
Добавляйте свои представления чисто программно, начиная с alloc / init и соответствующим образом устанавливая их фреймы.
Готово.
источник
Вместо того, чтобы отключать автоматическое размещение, я бы просто вычислил новое ограничение для кадра, который вы заменяете. Мне кажется, что это подходящий способ. Если вы настраиваете компоненты, которые зависят от ограничений, отрегулируйте их соответствующим образом.
Например, если у вас есть вертикальное ограничение 0 между двумя представлениями (myView и otherView), и у вас есть жест панорамирования или что-то, что регулирует высоту myView, тогда вы можете пересчитать ограничение с настроенными значениями.
источник
Для тех из вас, кто использует автоматический макет, ознакомьтесь с моим решением здесь . Вы должны создать
@IBOutlet
ограничения, которые хотите настроить, а затем изменить их константы.источник
если это файл xib:
источник