Xcode - чи є спосіб перетягнути компонент з одного подання на інший, не втрачаючи його кадру?


91

Що я хотів би зробити, це перетягнути компонент / вигляд з одного суперпрегляду на інший у конструкторі інтерфейсів Xcode, не скидаючи його кадру / положення.

Поводження Xcode за замовчуванням при цьому видається для центрування подання, яке переміщується вертикально та горизонтально в новому супервигляді, зберігаючи свої розміри. Це надзвичайно неприємно, оскільки це означає, що подання потрібно переставити вручну у новому суперпрегляді. Але я його правильно розташував до того, як перемістив, тому я хотів би, щоб Xcode просто запам'ятав усі атрибути свого кадру, а не лише його ширину / висоту. Чи можливо це?


Раніше, коли ви вирізали та вставляли рамку, вона залишалася незмінною. Спробуйте і подивіться.
Девід Х,

Дякую за пропозицію, на жаль, це, здається, не працює. Або я просто вирізав / вставив неправильно. Що трапляється, XCode замінює подання, яке я намагаюся вставити, видом, який я вставляю (і якщо я спробую вставити кілька речей одночасно, він просто використовує перший елемент у списку). Копія робить те саме.
aroth

Спробуйте вставити його в ліву бічну колонку - список. Виберіть супер-вигляд, а потім вставте. В іншому випадку, вибачте, поза пропозиціями.
David H

Спробував обидва шляхи. Не працює. Закінчилося тим, що потрібно зробити це важким способом.
aroth

Здається, є обхідний шлях у stackoverflow.com/questions/12034293/…, але це не дуже добре
Євген Осовецький

Відповіді:


223

Інше рішення:

  1. Потім виберіть елементи, які ви хочете у своєму підпрогляді
  2. (на панелі інструментів) Редактор> Вбудувати> тип подання, до якого потрібно вбудувати.

12
Дякую. Це має бути прийнятою відповіддю. Виберіть усі подання, які ви хочете перенести в новий супер-вигляд -> вбудувати у вигляд -> перемістити новий вигляд контейнера у потрібний супер-вигляд -> редактор - незакріплений. Вуаля! Усі подання знаходяться в новому суперперегляді з правильними кадрами.
Accatyyc

18
Шкода, що будь-які обмеження автоматичного макетування не копіюються, єдиний спосіб, який я бачив, - це вручну редагувати xml xml: indiestack.com/2013/12/transplanting-constraints
Джеймс,

1
Все ще дивно, коли я вбудовую свої підпрограми в їх новий супергляд, супергляд має дивні координати. Починається з -20 x та -20 y, а потім, якщо я встановлю 0,0, все не в центрі.
user3344977

1
@James Я раніше це робив. Але я виявив, що якщо ви створюєте подання Command-X_Command-V у Xcode 6, обмеження між вставленими поданнями дотримуються. Невелике вдосконалення.
Стівен Крамер

4
@StevenKramer Я спробував з Command-X і Command-V, не працював у мене. У вас є ще кроки для цього? Мені цікаво
arh

28

Я знайшов щось, що може допомогти вам, хлопці!

Завдання полягає в перегрупуванні "дочірніх поглядів" у "батьківський подання", щоб вони стали ієрархічно дочірніми елементами батьківського подання та зберегли фізичні позиції на дисплеї, як і до дії.

По-перше, налаштуйте батьківський вигляд, щоб він фізично охоплював область дочірніх поглядів. По-друге, переконайтеся, що всі діти описуються нижче у списку переглядів.

Тепер виділіть усіх дітей за допомогою миші та перемістіть їх, наприклад, на один піксель вгору та на один піксель вниз (просто для того, щоб сказати, що ІВ є деякі зміни). Після цього звільніть дітей, і вони чарівним чином стануть дітьми батьків і збережуть свої позиції на виставці.

Це працює для мене на OSX 10.8.2 та Xcode 4.6.

Удачі!


Чудово ... Це навіть не порушує розеток і рамок. Вбудовування у поле зору розбиває кадри Метод вирізання пасти розбиває розетки та рами.
jeet.chanchawat

22

Мені вдалося заощадити багато часу, витраченого на перестановку речей, і зробив це:

  1. Додайте батьківський подання у Interface Builder на тому самому рівні, що й можливі підпрограми.
  2. Відкрийте розкадрування в текстовому редакторі та скопіюйте можливі підпрограми всередині тегів підпоглядів батьківського подання. XCode буде оновлюватися після збереження.

Не дуже елегантний, хоча, я не можу зрозуміти, чому XCode не підтримує його за допомогою Shift або щось інше.


3
Це єдина відповідь, яка стабільно працює для мене в Xcode 5 без суєти. "Редактор-> Вбудувати" здається, це повинна бути правильна відповідь, але не завжди в списку подання, куди я хочу перенести підзаголовки.
Дентон,

10
  1. Виберіть усі елементи керування, які ви хочете перенести з одного UIView на інший UiView (не будьте дочірнім) або ScrollView

  2. Вирізати / скопіювати

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

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

ПРИМІТКА: Я працюю на XCode 4.2


Гей, якщо це працює, це найкраща відповідь тут (для перетягування декількох елементів керування до існуючого подання)
Колін,

@me на Xcode 4.6.2, неможливо відкрити вторинне вікно перегляду подвійним клацанням по ньому, тому цей метод не працює.
Колін

Працює добре в 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. Виберіть подання для вставки, яке ви скопіювали, та Редактор -> Відмінено

Крок 6 видалить вид вбудовування, і ви скопіюєте лише підпрогляди.


2

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

З:
Вбудовування подання (яке містить безліч інших підпоглядів у ньому) у ScrollView або в інший вигляд верхнього рівня не є прямим у порівнянні з тим, що я бачив досі. Те, що трапляється незабаром після того, як усі підпрограми можуть здатися недоречними, оскільки не вдалося знайти оригінальний кадр.

В:
Виконайте наступні кроки, і ви зможете вирішити це якнайпростіше:

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

Ні, ще не закінчено! Іноді можуть виникнути проблеми, пов’язані з обмеженням інтерфейсу користувача, і вам доведеться їх вирішити відповідно.


1

Я виявив інший підхід. Це в основному: Move = Cut + Paste

Таким чином ви робите:

  • отримати усі свої підпрограми, щоб бути дочірніми для нового батьківського подання (P ')
  • зберігайте (майже) всі свої обмеження в розкадруванні на основі автоматичного макета
  • зберігайте відносні позиції (фрейми) вашого підпрогляду один до одного

Таким чином ви не робите:

  • редагувати файл Storyboard в текстовому редакторі

Справа в тому, що кожне представлення, крім одного (кореневого) в Storyboard, має батьківський погляд . Далі, під час копіювання / переміщення декількох підпроглядів ви втрачаєте рамки та обмеження .

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

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

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

І з оригінального батьківського подання (P) ви:

  • видаліть усіх дітей, яких ви хотіли переїхати

До:

Вид1

Вигляд2

P

SV-ви-хочете переїхати

SV-ти-ти-не-хочеш-рухатись

Вигляд3

Після:

Вид1

Вигляд2

P

SV-ти-ти-не-хочеш-рухатись

Вигляд3

P '

СВ-ти хочеш переїхати

Я повинен наголосити, що це не узагальнює добре, якщо у вас, наприклад, UIScrollView є батьківським видом. Тоді його копія знову буде UIScrollView, що може бути небажаним.

Інша справа, що коли ви видаляєте деякі підпрограми (SV) у вихідному батьківському поданні (P), можливо, вам доведеться відтворити деякі обмеження, якщо інші (непереміщені підподання) посилаються на них. Але ви все одно повинні це зробити.


0

Що допомогло мені вирішити це питання -

  1. Створіть бажаний батьківський подання (вигляд прокрутки або uiview) у xib на кореневому рівні та відповідно змініть його розмір
  2. Скопіюйте всі подання, які ви хочете бути підпроглядами цього батьківського подання, та вставте їх у нове подання, яке ви створили на кроці 1
  3. На цьому етапі ви дублюєте ці погляди. Нещодавно додані подання будуть неправильно вирівняні, але все ще в тому ж порядку і на однаковій відстані по відношенню один до одного, вирівняти їх у xib, щоб відповідати своїм межам зі старими копіями того самого подання (Це передбачає, що новий батьківський подання має ті ж межі, що і старий)
  4. Нещодавно додані подання втратять деякі обмеження. Зверніться до старих подань, щоб їх виправити
  5. Видаліть старі подання з xib
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.