Xcode - есть ли способ перетащить компонент из одного представления в другое без потери его кадра?

91

Я бы хотел перетащить компонент / представление из одного супервизора в другой в построителе интерфейса Xcode без сброса его кадра / положения.

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

арот
источник
Раньше при вырезании и вставке рамка оставалась прежней. Попробуйте и убедитесь.
David H
Спасибо за предложение, к сожалению, оно не работает. Или я просто неправильно вырезал / наклеил. Что происходит, так это то, что XCode заменяет представление, которое я пытаюсь вставить, на представление, которое я вставляю (и если я попытаюсь вставить сразу несколько элементов, он просто использует первый элемент в списке). Копирование делает то же самое.
арот
Попробуйте вставить его в левый столбец - список. Выберите супер-вид, а затем вставьте. В противном случае, извините, предложений нет.
David H
Пробовал оба способа. Не работает. В итоге пришлось сделать это на горьком опыте.
Aroth
Кажется, есть обходной путь в stackoverflow.com/questions/12034293/… но это не очень хорошо
Евгений Осовецкий

Ответы:

224

Другое решение:

  1. Выберите элементы, которые вы хотите видеть в подвиде, затем
  2. (на панели инструментов) Редактор> Встроить> тип представления для встраивания.
Джей
источник
12
Спасибо. Это должен быть принятый ответ. Выберите все представления, которые вы хотите переместить в новый супервизор -> встроить в представление -> переместить новое представление контейнера в желаемое супервизор -> редактор - без внедрения. Вуаля! Все виды находятся в новом супервизоре с правильными кадрами.
Accatyyc
18
Жаль, что любые ограничения автоматической компоновки не копируются, единственный способ, который я видел, - это вручную отредактировать xml xib
Джеймс,
1
Одна вещь, которая все еще странна, - когда я встраиваю свои подвиды в их новую супервизию, супервизия имеет странные координаты. Он начинается с -20 x и -20 y, а затем, если я устанавливаю его на 0,0, все не по центру.
user3344977 05
1
@ Джеймс. Я так делал. Но я обнаружил, что если вы используете представления Command-X_Command-V в Xcode 6, ограничения между вставленными представлениями соблюдаются. Небольшое улучшение.
Стивен Крамер,
4
@StevenKramer Я пробовал использовать Command-X и Command-V, у меня не получилось. У вас есть еще шаги для этого? Мне интересно
arh
28

Я нашел кое-что, что может вам помочь!

Задача состоит в том, чтобы перегруппировать «дочерние представления» в «родительские представления», чтобы они стали иерархически дочерними по отношению к родительскому представлению и сохранили физические позиции на дисплее, как и до действия.

Во-первых, настройте родительский вид так, чтобы он физически занимал область дочерних видов. Во-вторых, убедитесь, что все дочерние элементы находятся под ним в списке просмотра.

Теперь выберите всех дочерних элементов с помощью мыши и переместите их, например, на один пиксель вверх и на один пиксель вниз (просто чтобы сказать IB, есть некоторые изменения). После этого отпустите детей, и они волшебным образом станут детьми родителя и сохранят свои позиции на виду.

У меня это работает на OSX 10.8.2 и Xcode 4.6.

Удачи!

Ведрано
источник
Потрясающе ... Это даже розетки и рамки не ломает. Вставить в вид разрывает кадры. Метод вырезания и пасты ломает розетки и рамы.
jeet.chanchawat
22

Мне удалось сэкономить много времени, потраченного на изменение положения, и я сделал следующее:

  1. Добавьте родительский вид в Интерфейсном Разработчике на том же уровне, что и потенциальные подвиды.
  2. Откройте раскадровку в текстовом редакторе и скопируйте потенциальные подпредставления внутри тегов подвидов родительского представления. XCode обновится после того, как вы его сохраните.

Не очень элегантно, не понимаю, почему XCode не поддерживает его с Shift или чем-то еще.

Степан Груда
источник
3
Это единственный ответ, который стабильно работает у меня в Xcode 5 без суеты. «Editor-> Embed In» кажется правильным ответом, но он не всегда перечисляет представление, в которое я хочу переместить подпредставления.
Denton
10
  1. Выберите все элементы управления, которые вы хотите переместить из одного UIView в другой UiView (не может быть дочерним) или ScrollView

  2. Вырезать / Копировать

  3. Теперь, после перетаскивания нового UIView / ScrollView в существующий UIView, не щелкайте один раз, чтобы выбрать его, вместо этого ДВОЙНО щелкните новый UIView / ScrollView и вставьте все элементы управления.

  4. Разница в расстоянии между всеми элементами управления останется неизменной, но, возможно, вам придется снова изменить положение элементов управления. Так что не щелкайте в любом месте, пока не переместите их, просто переместите все элементы управления с помощью стрелок навигации, поскольку все они уже выбраны, или вы можете выбрать их снова.

ПРИМЕЧАНИЕ: я использую XCode 4.2

Сурангшу Бисвас
источник
Привет, если это сработает, это лучший ответ здесь (для перетаскивания нескольких элементов управления в существующее представление)
Колин
@me в Xcode 4.6.2 невозможно открыть дополнительное окно просмотра двойным щелчком по нему, поэтому этот метод не работает.
Colin
Хорошо работает в Xcode 5. Относительное позиционирование остается неизменным, только вертикальное позиционирование отключено, но это достаточно просто, чтобы изменить положение всей группы сразу.
qix
Плохо то, что вы теряете свои ограничения автоматического размещения: '( indiestack.com/2013/12/transplanting-constraints здесь вы можете найти способ «трансплантации» ограничений
Джоан Кардона,
4

Я сделал что-то похожее на решение Степана, без использования раскадровки. В IB при открытом представлении ViewController:

  1. Создайте другое представление в дополнение к основному представлению VC.
  2. Переместите все подвиды во второе представление, перетащив их из одного представления в другое (перетаскивание из списка слева сбрасывает их положение). Если вы не можете выбрать их из IB с помощью мыши, выберите все из списка слева, затем выберите последнее подвид на панели IB, используя кнопку «cmd».
  3. Верните их к окончательному виду на исходном основном виде.
  4. Удалил добавленный вид, все готово.
Юнус Недим Мехел
источник
2

Это лучшее решение для копирования подпредставлений в другое представление с сохранением позиций:

  1. Выберите элементы, которые вы хотите видеть в подвиде, затем
  2. Редактор -> Вставить -> Просмотр
  3. Скопируйте это представление (Cmd + C)
  4. Отменить (Cmd + Z) (поскольку вам просто нужны подвиды)
  5. Перейдите к представлению, в котором вы хотите использовать подвиды, и вставьте его (Cmd + V)
  6. Выберите представление встраивания, которое вы скопировали и вставили, а затем Editor -> Unembed.

На шаге 6 будет удалено внедренное представление, и вы скопируете только подвиды.

Дхрув Гоэль
источник
2

Xcode Interface Builder сбивает с толку, когда родительский вид перетаскивается в другое представление (UIView, ScrollView, StackView)

Вопрос:
Встраивание представления (которое содержит множество других подвидов внутри него) в ScrollView или в другое представление верхнего уровня - непростая задача по сравнению с тем, что я видел до сих пор. Вскоре после этого все подвиды могут показаться неуместными из-за того, что не удалось найти их исходный фрейм.

О:
Выполните следующие шаги, и вы сможете решить эту проблему как можно проще:

  1. Выберите элементы, которые вы хотите видеть в подвиде, затем
  2. Перейдите в панель меню Редактор -> Вставить в -> Просмотр
  3. Скопируйте это новое представление (Cmd + C) с вложенными представлениями (для меня в настоящее время все ограничения были сохранены на данный момент)
  4. Перейдите в представление (будь то ScrollView или может быть StackView), в котором должны быть вложенные представления, и вставьте (Cmd + V) скопированное представление
  5. Выберите вставленный вид внедрения (который вы недавно создали) и перейдите в строку меню Xcode, Editor -> Unembed.

Нет, еще не закончено! Иногда вы можете столкнуться с тем, что есть еще несколько проблем, связанных с ограничениями пользовательского интерфейса, вам придется решать их соответствующим образом.

Рандика Вишман
источник
1

Я обнаружил другой подход. Это в основном: Переместить = Вырезать + Вставить

Таким образом вы делаете:

  • сделать все ваши подпредставления дочерними по отношению к новому родительскому представлению (P ')
  • сохраните (почти) все ваши ограничения в раскадровке на основе Auto-Layout
  • сохраняйте относительные позиции (фреймы) вашего subview друг к другу

Таким образом вы не:

  • редактировать файл раскадровки в текстовом редакторе

Дело в том, что каждое представление, кроме одного (корневого) в Storyboard, имеет свое родительское представление . Затем, когда вы копируете / перемещаете несколько подпредставлений, вы теряете рамки и ограничения .

Ответ довольно прост. Вы делаете копию своих подвидов (SV), копируя их родительское представление (P) в новое родительское представление (P '). Таким образом, вам может потребоваться воссоздать только ограничения из этого родительского нового представления (P ') в его новое родительское представление, но не для каждого подпредставления, которое вы хотите переместить.

После того, как вы сделали копию родительского представления (P) в новый (P '), из этого нового представления (P') вы:

  • удалите всех детей, кроме тех, которых вы хотели переместить
  • воссоздать новые родительские (P ') ограничения
  • воссоздать возможные выходы Interface Builder для (SV)

И из исходного родительского представления (P) вы:

  • удалите всех детей, которых вы хотели переместить

Перед:

View1

View2

п

SV-вы-хотите-переехать

SV-вы-не-хотите-переезжать

View3

После:

View1

View2

п

SV-вы-не-хотите-переезжать

View3

П'

SV-вы-хотите-переехать

Я должен подчеркнуть, что это не очень хорошо обобщает, если у вас, например, UIScrollView в качестве родительского представления. Тогда его копия будет снова UIScrollView, что может быть нежелательно.

Другое дело, когда вы удаляете некоторые из подпредставлений (SV) в исходном родительском представлении (P), вам может понадобиться воссоздать некоторые ограничения, если на них ссылаются другие (неподвижные подпредставления). Но вы все равно должны это сделать.

Ведрано
источник
0

Что помогло мне решить эту проблему, так это-

  1. Создайте желаемое родительское представление (представление прокрутки или uiview) в xib на корневом уровне и соответственно измените его размер.
  2. Скопируйте все представления, которые вы хотите использовать в качестве подвидов этого родительского представления, и вставьте их в новое представление, созданное на шаге 1.
  3. На этом этапе вы продублируете эти представления. Вновь добавленные представления будут смещены, но все еще в том же порядке и на одинаковом расстоянии друг от друга, выровняйте их в xib, чтобы они соответствовали их границам со старыми копиями того же представления (это предполагает, что новое родительское представление имеет те же границы, что и старый)
  4. Недавно добавленные представления потеряют некоторые ограничения, обратитесь к старым представлениям, чтобы исправить эти
  5. Удалите старые представления из xib
неха
источник