Xcode - Apakah ada cara untuk menyeret komponen dari satu tampilan ke tampilan lain tanpa kehilangan bingkainya?


91

Yang ingin saya lakukan adalah menyeret komponen / tampilan dari satu superview ke superview lainnya di pembuat antarmuka Xcode tanpa bingkai / posisinya disetel ulang.

Perilaku default Xcode saat melakukan ini tampaknya memusatkan tampilan yang dipindahkan secara vertikal dan horizontal dalam tampilan super barunya, sambil mempertahankan dimensinya. Ini sangat menjengkelkan, karena itu berarti tampilan harus diatur ulang posisinya secara manual di superview barunya. Tetapi saya telah memposisikannya dengan benar sebelum saya memindahkannya, jadi saya ingin Xcode hanya mengingat semua atribut bingkainya, bukan hanya lebar / tingginya. Apakah ini mungkin?


Tepat waktu di masa lalu, jika Anda memotong dan menempelkan bingkai tetap sama. Cobalah dan lihat.
David H

Terima kasih atas sarannya, sayangnya sepertinya tidak berhasil. Atau saya hanya memotong / menempelkannya dengan salah. Apa yang terjadi adalah XCode menggantikan tampilan yang saya coba tempelkan dengan tampilan yang saya tempelkan (dan jika saya mencoba menempelkan beberapa hal sekaligus, itu hanya menggunakan item pertama dalam daftar). Salin melakukan hal yang sama.
Apakah

Coba tempelkan ke kolom sisi kiri - daftar. Pilih tampilan super lalu tempel. Jika tidak, maaf, karena saran.
David H

Mencoba dua arah. Tidak berhasil. Akhirnya harus melakukannya dengan cara yang sulit.
Apakah

Tampaknya ada solusi di stackoverflow.com/questions/12034293/… tetapi itu tidak terlalu bagus
Eugene Osovetsky

Jawaban:


224

Solusi lain:

  1. Pilih item yang Anda inginkan di subview Anda, lalu
  2. (di bilah alat) Editor> Sematkan> jenis tampilan untuk disematkan.

12
Terima kasih. Ini harus menjadi jawaban yang diterima. Pilih semua tampilan yang ingin Anda pindahkan ke tampilan super baru -> sematkan dalam tampilan -> pindahkan tampilan penampung baru ke tampilan super yang diinginkan -> editor - tidak terpasang. Voila! Semua tampilan dalam tampilan super baru dengan bingkai yang benar.
Accatyyc

18
Sayang sekali kendala tata letak otomatis tidak disalin, satu-satunya cara yang pernah saya lihat adalah dengan mengedit xml xib secara manual: indiestack.com/2013/12/transplanting-constraints
James

1
Satu hal yang masih aneh adalah ketika saya menyematkan subview saya ke superview baru mereka, superview tersebut memiliki koordinat yang aneh. Ini dimulai dengan -20 x dan -20 y, dan kemudian jika saya set ke 0,0 semuanya off-center.
pengguna3344977

1
@James Saya dulu melakukan itu. Tetapi saya menemukan bahwa jika Anda melihat Command-X_Command-V di Xcode 6, batasan antara tampilan yang ditempelkan dipatuhi. Perbaikan kecil.
Steven Kramer

4
@StevenKramer Saya mencoba dengan Command-X dan Command-V, tidak berhasil untuk saya. Apakah Anda memiliki langkah lain untuk melakukan ini? Saya tertarik
arh

28

Saya menemukan sesuatu yang mungkin bisa membantu kalian!

Tugasnya adalah untuk mengelompokkan kembali "tampilan anak" menjadi "tampilan induk" sehingga mereka menjadi anak dari tampilan induk secara hierarki dan mempertahankan posisi fisik pada tampilan seperti sebelum tindakan.

Pertama, sesuaikan tampilan induk agar secara fisik menutupi area tampilan anak. Kedua, pastikan bahwa semua anak di bawahnya dalam daftar tampilan.

Sekarang pilih semua anak dengan mouse dan gerakkan mereka, misalnya satu piksel ke atas dan satu piksel ke bawah (hanya untuk mengatakan IB ada beberapa perubahan). Setelah itu lepaskan anak-anak dan mereka secara ajaib akan menjadi anak-anak dari orang tua dan tetap memajang posisi mereka.

Ini berfungsi untuk saya di OSX 10.8.2 dan Xcode 4.6.

Semoga berhasil!


Luar biasa ... Ini bahkan tidak merusak outlet dan bingkai. Sematkan dalam bingkai jeda tampilan. Metode potong tempel merusak outlet dan bingkai.
jeet.chanchawat

22

Saya berhasil menghemat banyak waktu yang dihabiskan untuk memposisikan ulang barang dan melakukan ini:

  1. Tambahkan tampilan induk di Interface Builder pada tingkat yang sama dengan calon subview.
  2. Buka storyboard di editor teks dan salin calon subview di dalam tag subview dari tampilan induk. XCode akan diperbarui setelah Anda menyimpannya.

Tidak terlalu elegan, tidak bisa melihat mengapa XCode tidak mendukungnya dengan Shift atau sesuatu.


3
Ini adalah satu-satunya jawaban yang secara konsisten berfungsi untuk saya di Xcode 5 tanpa keributan. "Editor-> Sematkan Dalam" sepertinya itu jawaban yang benar tetapi tidak selalu mencantumkan tampilan yang ingin saya pindahkan subview.
Denton

10
  1. Pilih semua kontrol yang ingin Anda pindahkan dari satu UIView ke UiView lain (bukan anak-anak) atau ScrollView

  2. Potong / Salin

  3. Sekarang setelah menyeret UIView / ScrollView baru ke UIView Anda yang ada, Jangan klik sekali untuk memilihnya, sebaliknya klik GANDA pada UIView / ScrollView baru dan tempel semua kontrol.

  4. Perbedaan jarak akan tetap sama di antara semua kontrol, tetapi Anda mungkin harus mengubah posisi kontrol lagi. Jadi jangan klik di mana pun sampai Anda telah mengubah posisinya, cukup ubah posisi semua kontrol dengan panah navigasi karena semuanya sudah dipilih, atau Anda dapat memilihnya lagi.

CATATAN: Saya menggunakan XCode 4.2


Hai, jika ini berhasil, itu adalah jawaban terbaik di sini (untuk menyeret beberapa kontrol ke tampilan yang ada)
Colin

@me di Xcode 4.6.2, tidak mungkin membuka jendela tampilan sekunder dengan mengklik dua kali di atasnya, jadi metode ini tidak berfungsi.
Colin

Bekerja dengan baik di Xcode 5. Pemosisian relatif tetap sama, hanya pemosisian vertikal yang tidak aktif, tetapi itu cukup mudah untuk mengubah posisi seluruh grup sekaligus.
qix

hal buruknya adalah Anda kehilangan batasan autolayout: '( indiestack.com/2013/12/transplanting-constraints di sini Anda dapat menemukan cara batasan "transplantasi"
Joan Cardona

4

Saya telah melakukan sesuatu yang mirip dengan solusi Stepan, tanpa menggunakan papan cerita. Di IB saat tampilan ViewController terbuka:

  1. Buat tampilan lain selain tampilan utama VC
  2. Pindahkan semua subview ke tampilan kedua dengan menyeret mereka dari satu tampilan ke tampilan lain (menyeret dari daftar di sisi kiri mengatur ulang posisinya) Jika Anda tidak dapat memilih mereka dari IB menggunakan mouse Anda, lalu pilih semua dari daftar di sisi kiri lalu pilih satu subview terakhir dari panel IB menggunakan tombol "cmd".
  3. Bawa mereka kembali ke tampilan akhir pada tampilan utama awal.
  4. Hapus tampilan yang ditambahkan, semua siap.

2

Ini adalah solusi terbaik untuk menyalin subview ke tampilan lain dan mempertahankan posisi:

  1. Pilih item yang Anda inginkan di subview Anda, lalu
  2. Editor -> Sematkan Dalam -> Lihat
  3. Salin Tampilan ini (Cmd + C)
  4. Undo (Cmd + Z) (Karena Anda hanya ingin subview)
  5. Pergi ke tampilan yang Anda inginkan untuk subview dan tempelkan (Cmd + V)
  6. Pilih Embedding View yang Anda copy-paste dan Editor -> Unembed

Langkah 6 akan menghapus tampilan embedding dan Anda akan menyalin subview saja.


2

Xcode Interface Builder kacau saat Parent View diseret dan dijatuhkan ke View lain (UIView, ScrollView, StackView)

T:
Menyematkan Tampilan (yang berisi banyak subview lain di dalamnya) ke ScrollView atau tampilan tingkat atas lainnya tidak langsung dengan apa yang telah saya lihat sejauh ini. Apa yang terjadi segera setelah itu adalah semua subview mungkin tampak salah tempat karena tidak dapat menemukan bingkai aslinya.

J:
Ikuti langkah-langkah berikut dan Anda akan dapat menyelesaikannya semudah mungkin:

  1. Pilih item yang Anda inginkan di subview Anda, lalu
  2. Pergi ke menubar, Editor -> Embed In -> View
  3. Salin Tampilan baru ini (Cmd + C) dengan subview (bagi saya saat ini semua batasan dipertahankan sejauh ini pada saat ini)
  4. Pergi ke tampilan (baik itu ScrollView atau mungkin StackView) Anda ingin subview masuk dan tempel (Cmd + V) tampilan yang disalin
  5. Pilih Tampilan Sematan yang ditempelkan (yang baru saja Anda buat sebelumnya) dan Pergi ke bilah menu Xcode, Editor -> Unembed

Tidak, belum selesai! Terkadang, Anda mungkin mengalami bahwa ada beberapa masalah terkait Kendala UI, Anda harus menyelesaikannya sesuai dengan itu.


1

Saya mendeteksi pendekatan lain. Pada dasarnya: Pindah = Potong + Tempel

Dengan cara ini Anda melakukannya:

  • dapatkan semua subview Anda menjadi anak dari tampilan orang tua baru (P ')
  • pertahankan (hampir) semua batasan Anda di Papan Cerita berbasis Tata Letak Otomatis
  • menjaga posisi relatif subview Anda (frame) satu sama lain

Dengan cara ini Anda tidak:

  • edit file Storyboard di editor teks

Dasar masalahnya adalah bahwa setiap tampilan kecuali satu (root) di Storyboard memiliki tampilan induknya . Selanjutnya, saat Anda menyalin / memindahkan beberapa subview, Anda kehilangan bingkai dan batasan .

Jawabannya cukup sederhana. Anda membuat salinan subview (SVs) Anda dengan menyalin tampilan induknya (P) ke tampilan induk baru (P '). Dengan cara ini Anda mungkin perlu membuat ulang batasan dari tampilan baru induk (P ') ke tampilan induk barunya, tetapi tidak untuk setiap subview yang ingin Anda pindahkan.

Setelah Anda membuat salinan tampilan induk (P) menjadi yang baru (P '), dari tampilan baru itu (P') Anda:

  • pindahkan semua anak kecuali yang ingin Anda pindahkan
  • membuat ulang batasan new parent (P ')
  • membuat ulang kemungkinan outlet Interface Builder ke (SVs ')

Dan dari tampilan orang tua asli (P) Anda:

  • pindahkan semua anak yang ingin Anda pindahkan

Sebelum:

Lihat 1

Lihat2

P.

SVs-Anda-ingin-pindah

SVs-Anda-tidak-ingin-pindah

Lihat3

Setelah:

Lihat 1

Lihat2

P.

SVs-Anda-tidak-ingin-pindah

Lihat3

P '

SVs'-you-want-to-move

Saya harus menekankan bahwa ini tidak menggeneralisasi dengan baik jika Anda memiliki misalnya UIScrollView sebagai pandangan orang tua. Kemudian salinannya akan menjadi UIScrollView yang mungkin tidak diinginkan.

Hal lainnya adalah ketika Anda menghapus beberapa subview (SV) dalam tampilan induk asli (P), Anda mungkin perlu membuat ulang beberapa batasan jika yang lain (subview tidak dapat dipindahkan) mereferensikannya. Tapi Anda tetap harus melakukannya.


0

Apa yang membantu saya mengatasi masalah ini adalah-

  1. Buat tampilan induk yang diinginkan (tampilan gulir atau tampilan tampilan) di xib pada tingkat akar dan ubah ukurannya sesuai
  2. Salin semua tampilan yang ingin Anda jadikan subview dari tampilan induk ini dan tempelkan ke tampilan baru yang Anda buat di langkah 1
  3. Pada tahap ini Anda akan menduplikasi tampilan ini. Tampilan yang baru ditambahkan akan menjadi tidak sejajar tetapi masih dalam urutan yang sama dan pada jarak yang sama terhadap satu sama lain, sejajarkan di xib agar sesuai dengan batasnya dengan salinan lama dari tampilan yang sama (Ini mengasumsikan bahwa tampilan induk baru memiliki batas yang sama dengan yang lama)
  4. Tampilan yang baru ditambahkan akan kehilangan beberapa kendala, lihat tampilan lama untuk memperbaikinya
  5. Hapus tampilan lama dari xib
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.