Скопировать объекты с дополнительными элементами, включая "ограничения", используя конструктор интерфейса - iOS
Как вы копируете представление или объект с дополнительными объектами с ограничениями на другое представление?
Всякий раз, когда я это делаю, объект назначения - это просто заторник и исправление - это боль.
Ответы
Ответ 1
У меня была такая же проблема некоторое время назад, дайте мне знать, если это поможет:
Сохранять позицию при перемещении UIView в иерархии (вставить)
(скопировано здесь для справки):
Оригинальный ответ Джей:
fooobar.com/questions/69169/...
В принципе, вы не можете копировать/вставлять напрямую, но вы можете выполнить несколько дополнительных шагов:
- Выберите все виды, метки и т.д., вы хотите перейти к новому супер-представлению
- Редактор → встроенный в просмотр
- Переместите вновь созданный вид "контейнера" в представление, которое вы хотите вставить в исходное
- Выберите представление "контейнер". Редактор → unembed. Все элементы будут сбрасываться в супер-вид, сохраняя макет.
Ответ 2
Он не всегда сохраняет ограничения на месте, но единственный способ, которым я нашел перемещение группы представлений и сохранить позицию, - это выбрать несколько, а затем перетащить представления с помощью мыши в новое место. Вы даже можете копировать представления в новый файл, копируя/вставляя объект верхнего уровня, который будет сохранять все позиционирование, а затем перетаскивая группу представлений мышью между объектами представления верхнего уровня.
Ответ 3
Мне пришлось скопировать довольно сложную настройку AutoLayout из одного места в другое, поэтому я искал способы избежать необходимости вручную создавать все ограничения.
То, что я закончил, - очень тщательно изменить файл интерфейса XML. Вот как:
!!! Without proper care, you might corrupt your interface file !!!
!!! Have a backup before attempting this !!!
Шаг 1:
Используя обычный интерфейс Builder, переместите все представления из старого в свой новый супервизор. Не беспокойтесь, если они все испортились (например, все сосредоточено в новом супервизии или много ошибок AutoLayout). Пока сохраняется иерархия их представлений, это прекрасно.
Шаг 2:
Узнайте идентификаторы объектов вашего старого и нового супервизора. Они показаны в разделе "Утилиты" (правая сторона) Identity Inspector > Document > Object ID
. Идентификатор выглядит примерно как gGH-lW-Bke
.
![введите описание изображения здесь]()
Шаг 3:
Откройте файл интерфейса как XML (щелкните правой кнопкой мыши по storyboard/xib > Open As > Source Code
).
![введите описание изображения здесь]()
Теперь, очень тщательно, найдите и замените Object ID старого супервизора новым , если применимо. НЕ ДЕЛАЙТЕ "заменить все"! Вы должны менять его только в таких местах, как:
<constraint firstItem="gGH-lW-Bke" firstAttribute="top" secondItem="RXG-iN-Ra7" secondAttribute="top" id="u46-2d-oD0"/>
(Вам нужно заменить старый вид id
, где он указан как firstItem
или secondItem
)
И даже в этом случае, возможно, в вашем случае есть некоторые ограничения, которые не следует изменять (например, ограничения, которые вообще не относятся к просмотрам, которые вы только что переместили, но связаны со старым супервидом)! Итак, внимательно проведите.
Если вам нужно быть более безопасным, и если ваша установка является слишком сложной, вы можете сначала (до шага 1) составить список идентификаторов объектов всех видов, которые вы собираетесь переместить, и которые участвуют в ограничения с (около-заброшенным) супервидом.
Шаг 4:
Откройте файл интерфейса как обычно (щелкните правой кнопкой мыши > Open As > Interface Builder). Убедитесь, что все выглядит хорошо, нет предупреждений или ошибок.
Готово.
Ответ 4
У меня просто была эта проблема, я просто скопировал родительское представление ко всем объектам, которые я хотел переместить, и он сохранил все ограничения! Это Xcode 10